我有一个像这样的元组列表:
[(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)]
我根本不介意它不是单行,但我想知道一个有效的方法来解决这个问题......
答案 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