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



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

[(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)]

我完全不介意,如果它不是一行,但我想知道一个有效的方法来处理这个…

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)只选择具有最大值的元组,并且由于组的所有第二个值都相同(并且也是键),因此它给出具有最大第一个值的元组。

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

可能在使用字典:

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() ]
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)))

可以在元组的第二个元素上使用关键字字典:

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

最新更新