从列表中的每个键获取具有最大值的元组

时间:2011-09-28 23:44:13

标签: python algorithm list tuples

我有一个像这样的元组列表:

[(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]

我想保留每个元组的最大第一个值具有相同第二个值的元组。例如(2, 1)(3, 1)共享相同的第二个(键)值,因此我只想保留具有最大第一个值的那个 - > (3, 1)。最后我会得到这个:

[(1, 0), (3, 1), (6, 2), (2, 3)]

我根本不介意它不是单行,但我想知道一个有效的方法来解决这个问题......

4 个答案:

答案 0 :(得分:6)

from operator import itemgetter
from itertools import groupby

[max(items) for key, items in groupby(L,key = itemgetter(1))]

假设您的初始元组列表按键值排序。

groupby创建一个迭代器,它产生像(0, <itertools._grouper object at 0x01321330>)这样的对象,其中第一个值是键值,第二个是另一个迭代器,它给所有元组赋予该键。

max(items)只选择具有最大值的元组,并且由于该组的所有第二个值都相同(并且也是键),它会为元组提供最大的第一个值。

列表推导用于根据这些函数的输出形成元组的输出列表。

答案 1 :(得分:2)

可能使用词典:

rd = {}
for V,K in my_tuples:
  if V > rd.setdefault(K,V):
    rd[K] = V
result = [ (V,K) for K,V in rd.items() ]

答案 2 :(得分:0)

import itertools
import operator
l = [(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]
result = list(max(v, key=operator.itemgetter(0)) for k, v in itertools.groupby(l, operator.itemgetter(1)))

答案 3 :(得分:0)

您可以使用键入元组第二个元素的字典:

l = [(1, 0), (2, 1), (3, 1), (6, 2), (3, 2), (2, 3)]
d = dict([(t[1], None) for t in l])
for v, k in l:
  if d[k] < v:
    d[k] = v 
l2 = [ (v, k) for (k, v) in d.items() if v != None ]
print l2