我想比较一个元组列表,如果第一个元素相同,那么比较第二个元素并返回最高元素。
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")]
我不知道该怎么做,任何帮助都会受到赞赏。
答案 0 :(得分:3)
我使用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')]
答案 1 :(得分:2)
元组比较已经这样做,比较第一个元素然后继续比较,直到找到决胜局。
您需要做的只是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')]
答案 2 :(得分:1)