繁体   English   中英

比较元组列表

[英]Comparing a list of tuples

我想比较一个元组列表,如果第一个元素相同,则比较第二个元素并返回最高的。

lis = [(1,10, "n"), (1,15,"n1"), (2,20,"n"),(2,35,"n1"),(3,123,"n"),(3,12,"n1")]

返回:

lis = [(1,15,"n1"), (2,35,"n1"), (3,123,"n")]

我不确定该怎么做,任何帮助将不胜感激。

我将使用itertools.groupby首先将具有相同第一个元素的所有项目分组在一起,然后使用max查找具有最大第二个元素的项目。

与其他答案不同,您可能具有来自不同“组”的不同数量的元素。

from itertools import groupby
from operator import itemgetter

lis = [(1,10, "n"), (1,15,"n1"), (2,20,"n"), (2,35,"n1"), (3,123,"n"),(3,12,"n1")]

lis.sort(key=itemgetter(0))  # groupby requires the iterable to be sorted,
                             # so making sure it is

grouped_by = groupby(lis, key=itemgetter(0))

output = [max(li, key=itemgetter(1)) for group, li in grouped_by]
print(output)

# [(1, 15, 'n1'), (2, 35, 'n1'), (3, 123, 'n')]

元组比较已经做到了,先比较第一个元素,然后再比较第二个元素,直到找到一个决胜局。

您需要做的就是zip列表,以创建正确的比较:

zip(lis[::2], lis[1::2])
# This produces:
# (1, 10, 'n') (1, 15, 'n1')
# (2, 20, 'n') (2, 35, 'n1')
# (3, 123, 'n') (3, 12, 'n1')

创建所需的对,然后可以在列表理解中对它们进行比较以获得所需的结果:

r = [i if i > j else j for i,j in zip(lis[::2], lis[1::2])]
print(r)
# [(1, 15, 'n1'), (2, 35, 'n1'), (3, 123, 'n')]

使用range()max()函数的解决方案:

lis = [(1,10, "n"), (1,15,"n1"), (2,20,"n"),(2,35,"n1"),(3,123,"n"),(3,12,"n1")]
result = [max(lis[i:i+2]) for i in range(0, len(lis), 2)]

print(result)

输出:

[(1, 15, 'n1'), (2, 35, 'n1'), (3, 123, 'n')]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM