根据最大值删除元组列表中的重复项

时间:2018-09-06 23:22:39

标签: python list dictionary set tuples

假设我有一个tuples的列表,如下所示:

[('Machine1', 88), ('Machine2', 90), ('Machine3', 78), ('Machine1', 90), ('Machine3', 95)]

我想过滤列表,以便我只拥有与每个tuple配对有关的最高值。因此,在此示例中,过滤后的列表为:

[('Machine2', 90),('Machine1', 90), ('Machine3', 95)]

我基本上想以最高的值删除重复项。我知道set仅删除完全相同的重复项,因此在这里我将无法做到这一点。我认为我可以使用的另一种方法是使用dictionary并在迭代列表时更新它(如果看到更高的值)。但是,有什么更Python化的方法来解决这个问题?

3 个答案:

答案 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的一种解决方案。这个想法是迭代您的元组列表并追加到列表中。然后将zipmap + 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])]