假设我有一个tuples
的列表,如下所示:
[('Machine1', 88), ('Machine2', 90), ('Machine3', 78), ('Machine1', 90), ('Machine3', 95)]
我想过滤列表,以便我只拥有与每个tuple
配对有关的最高值。因此,在此示例中,过滤后的列表为:
[('Machine2', 90),('Machine1', 90), ('Machine3', 95)]
我基本上想以最高的值删除重复项。我知道set
仅删除完全相同的重复项,因此在这里我将无法做到这一点。我认为我可以使用的另一种方法是使用dictionary
并在迭代列表时更新它(如果看到更高的值)。但是,有什么更Python化的方法来解决这个问题?
答案 0 :(得分:3)
一个简单的dict
d = {}
for machine, value in l:
d[machine] = max(d.get(machine, -float('inf')), value)
print(list(d.items()))
输出
[('Machine1', 90), ('Machine2', 90), ('Machine3', 95)]
使用pandas
(很有趣)
>>> pd.DataFrame(l).groupby(0).max().to_dict()[1].items()
[('Machine1', 90), ('Machine2', 90), ('Machine3', 95)]
答案 1 :(得分:2)
这是使用collections.defaultdict
的一种解决方案。这个想法是迭代您的元组列表并追加到列表中。然后将zip
与map
+ max
结合使用以创建所需的结果。
from collections import defaultdict
L = [('Machine1', 88), ('Machine2', 90), ('Machine3', 78),
('Machine1', 90), ('Machine3', 95)]
d = defaultdict(list)
for name, num in L:
d[name].append(num)
res = list(zip(d, map(max, d.values())))
结果
[('Machine1', 90), ('Machine2', 90), ('Machine3', 95)]
答案 2 :(得分:1)
在itertools中可能使用groupby运算符:
>>> import itertools as it
>>> [ (k, max( list(zip(*g))[1]) ) for k,g in it.groupby(sorted(data), key=lambda m: m[0])]
请记住,数据已排序,因此您也可以这样做:
>>> [ (k, list(zip(*g))[1][-1] ) for k,g in it.groupby(sorted(data), key=lambda m: m[0])]