【问题标题】:Remove duplicates in a list of tuples based on max value根据最大值删除元组列表中的重复项
【发布时间】:2019-02-12 06:14:19
【问题描述】:

假设我有一个这样的tuples 列表:

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

我想过滤列表,以便我只有与每个 tuple 配对相关的最高值。所以在这个例子中,过滤后的列表是:

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

我基本上想按最高值删除重复项。我知道set 只删除精确的重复项,所以我不能在这里这样做。我认为我可以使用的另一种方法是使用dictionary 并在迭代列表时更新它,如果看到更高的值。但是,有什么更 Pythonic 的方式来解决这个问题?

【问题讨论】:

  • dict 是个好方法;任何可以为您提供groupby 运算符的数据结构也是如此。 Stack Overflow 不是一个设计网站——试一试,让我们看看你的代码!

标签: python list dictionary set tuples


【解决方案1】:

一个简单的解决方案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)]

【讨论】:

  • 可以一直使用inf,将编辑:) 好建议!
【解决方案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)]

【讨论】:

    【解决方案3】:

    或许可以在 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])]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-27
      • 2016-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2015-06-27
      相关资源
      最近更新 更多