>我有一个列表列表:
l = [['a1', 2], ['a1', 3], ['a1', 1], ['b1', 4], ['b1', 2], ['b1', 6], ['c1', 2]]
我想将每个"子列表"与其他"子列表"进行比较,匹配索引[0]
值相同的列表,并只保留索引[1]
最大的列表,因此结果如下所示:
resultingList = [['a1', 3], ['b1', 6], ['c1', 2]]
我一直在尝试各种 for 循环和条件语句,但我卡住了。
有人可以帮我一把,让我走上正轨吗?
使用 itertools.groupby
from itertools import groupby
l=[['a1',2],['a1',3],['a1',1],['b1',4],['b1',2],['b1',6],['c1',2]]
l = [max(g, key=lambda x: x[1]) for k, g in groupby(sorted(l), key=lambda x: x[0])]
自然答案是使用 itertools.groupby
,按子列表的第一个元素分组,并简单地将max
应用于每个组。由于第一个分组元素是相同的,因此max
自然会根据第二个元素(整数)进行最大值。
import itertools
l=[['a1',2],['a1',3],['a1',1],['b1',4],['b1',2],['b1',6],['c1',2]]
print([max(v) for _,v in itertools.groupby(l,lambda x : x[0])])
结果:
[['a1', 3], ['b1', 6], ['c1', 2]]
注意:如果列表未根据第一个元素值排序,则需要使用sorted(l)
而不是l
制作一个字典来保存所有最大值:
L = [['a1',2],['a1',3],['a1',1],['b1',4],['b1',2],['b1',6],['c1',2], ...]
d = {}
for k,v in L:
d[k] = max(d.get(k, -float('inf'), v)
这样的operator.itemgetter
替换@Patrick Haugh解决方案中的lambda
表达式:
In [18]: from itertools import groupby
In [19]: from operator import itemgetter
In [20]: l = [['b1', 2], ['a1', 2], ['a1', 3], ['c1', 2], ['a1', 1], ['b1', 4], ['b1', 6]]
In [21]: [max(g, key=itemgetter(1)) for _, g in groupby(sorted(l), itemgetter(0))]
Out[21]: [['a1', 3], ['b1', 6], ['c1', 2]]