带重复项的列表并集

8 投票
3 回答
2705 浏览
提问于 2025-04-17 02:22

我想在Python3中合并两个列表,这两个列表可能会有重复的元素。而且在合并后的列表中,某些元素的数量应该是两个列表中该元素数量的最大值。下面是一个例子来说明这个问题:

[1,2,2,5]( some operator)[2,5,5,5,9]=[1,2,2,5,5,5,9]

有什么想法吗?

3 个回答

1
  1. 把数组转换成字典,用 a[key] = count 这种方式。

  2. 根据规则创建一个新的字典,规则是 c[key] = a.get(key, 0) > b.get(key, 0) and a[key] or b[key]。你需要遍历字典 a 和字典 b 中的所有键。

  3. 扩展字典,用 result += [value] * key 这种方式。

2

为什么一开始要用列表呢?我觉得那些数据看起来像字典:

[1,2,2,5] -> {1: 1, 2: 2, 5: 1}
[2,5,5,5,9] -> {2: 1, 5: 3, 9: 1}

那么就很简单了:

keys = set(a.keys()+b.keys())
vals = [max(a.get(n, 0), b.get(n, 0)) for n in keys]
d = dict(zip(keys, vals))
print d

结果是:

{1: 1, 2: 2, 5: 3, 9: 1}

14

你可以使用 collections.Counter 这个类:

>>> from collections import Counter
>>> combined = Counter([1,2,2,5]) | Counter([2,5,5,5,9])
>>> list(combined.elements())
[1, 2, 2, 5, 5, 5, 9]

它的作用类似于一个多重集合(就是一个无序的集合,里面的每个元素可以出现多次)。使用 | 操作符可以得到这两个多重集合的并集,在这个并集中,每个元素出现的次数是两个集合中该元素出现次数的最大值。

这个类是在 Python 2.7 和 3.1 中新增的。

撰写回答