我有一个像这样的元组列表:
[(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