python - 如何根据最大值返回具有唯一元素的元组列表?

标签 python

我想返回具有唯一 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/

相关文章:

python - 如何在 Python Turtle 中定位文本?

javascript - 无法在我的 Django 模板中使用 JSON.parse

python - 参数 'weak' 或 'strong' 对 scipy.sparse.csgraph.connected_components 有什么作用?

python - Python 中用于 Perl 的 Linux 命令

python - 使用 mongodb 的 Flask/uWSGI/nginx 应用程序超时

python - 在Python中显示选择Mysql查询,输出漂亮且可读

python - 我无法显示文件上传按钮

python - 无法使用原始 base64 形式和 python xmlrpc 客户端加载 torrent 文件

python - 获取用户在 Flask 中的位置

python - ttest_1samp 给出的 P_value 错误