比较元组列表

时间:2017-04-27 11:18:55

标签: python list python-3.x 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")]

我不知道该怎么做,任何帮助都会受到赞赏。

3 个答案:

答案 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)

使用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')]