我想返回具有唯一 ID 的元组列表,但特别保留具有最新日期的元组。
唯一 ID 位于每个元组的第一个元素中(即 1,2,3,4)。
每个元组的多个元素中存在日期(元组的第三个元素和第六个元素)。
a = [(1,'Y', 'rat', datetime.datetime(2016, 12, 12, 0, 0), 'N', None),
(2,'Y', 'ox', datetime.datetime(2017, 9, 4, 0, 0), 'N', None),
(1,'N', None, None, 'Y', datetime.datetime(2017, 9, 17, 0, 0)),
(2,'N', None, None, 'Y', datetime.datetime(2017, 3, 16, 0, 0)),
(3,'Y', 'tiger', datetime.datetime(2013, 1, 18, 0, 0), 'N', None),
(4,'N', None, None, 'Y', datetime.datetime(2017, 10, 3, 0, 0))]
我期望的输出是:
b = [(1,'N', None, None, 'Y', datetime.datetime(2017, 9, 17, 0, 0)),
(2,'Y', 'ox', datetime.datetime(2017, 9, 4, 0, 0), 'N', None),
(3,'Y', 'tiger', datetime.datetime(2013, 1, 18, 0, 0), 'N', None),
(4,'N', None, None, 'Y', datetime.datetime(2017, 10, 3, 0, 0))]
我已将元组放入字典中并使用 groupby 进行排序。
from itertools import groupby
dict={}
f = lambda x: x[0]
for key, group in groupby(sorted(a, key=f),f):
dict[key] = list(group)
这是字典输出:
{1: [(1, 'Y', 'rat', datetime.datetime(2016, 12, 12, 0, 0), 'N', None),
(1, 'N', None, None, 'Y', datetime.datetime(2017, 9, 17, 0, 0))],
2: [(2, 'Y', 'ox', datetime.datetime(2017, 9, 4, 0, 0), 'N', None),
(2, 'N', None, None, 'Y', datetime.datetime(2017, 3, 16, 0, 0))],
3: [(3, 'Y', 'tiger', datetime.datetime(2013, 1, 18, 0, 0), 'N', None)],
4: [(4, 'N', None, None, 'Y', datetime.datetime(2017, 10, 3, 0, 0))]}
从这一步开始,我无法将所需的字典值提取到新列表中。
提前感谢您的帮助!
最佳答案
首先,您可以定义一个函数来从元组中获取日期时间
,无论其位置如何。
然后,您可以按 id 和日期时间对列表进行反向排序,按 ID 进行分组,获取下一个条目,然后再次排序(因此它是按 ID 排序的)。
>>> getdate = lambda t: next(x for x in t if isinstance(x, datetime.datetime))
>>> sorted(next(g) for k, g in itertools.groupby(sorted(a, key=lambda t: (t[0], getdate(t)), reverse=True), key=lambda t: t[0]))
[(1, 'N', None, None, 'Y', datetime.datetime(2017, 9, 17, 0, 0)),
(2, 'Y', 'ox', datetime.datetime(2017, 9, 4, 0, 0), 'N', None),
(3, 'Y', 'tiger', datetime.datetime(2013, 1, 18, 0, 0), 'N', None),
(4, 'N', None, None, 'Y', datetime.datetime(2017, 10, 3, 0, 0))]
或者更短一些,只按 ID 排序一次,然后按日期获取 max
;相同的结果:
>>> [max(g, key=getdate) for k, g in itertools.groupby(sorted(a), key=lambda t: t[0])]
当然,使用简单的循环和字典也可以(并且更快)实现相同的效果...
d = dict()
for t in a:
if t[0] not in d or getdate(d[t[0]]) < getdate(t):
d[t[0]] = t
...但是,嘿,没有什么比过于复杂的俏皮话更好的了!
关于python - 如何根据最大值返回具有唯一元素的元组列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47914679/