带重复项的列表并集
我想在Python3中合并两个列表,这两个列表可能会有重复的元素。而且在合并后的列表中,某些元素的数量应该是两个列表中该元素数量的最大值。下面是一个例子来说明这个问题:
[1,2,2,5]( some operator)[2,5,5,5,9]=[1,2,2,5,5,5,9]
有什么想法吗?
3 个回答
1
把数组转换成字典,用
a[key] = count
这种方式。根据规则创建一个新的字典,规则是
c[key] = a.get(key, 0) > b.get(key, 0) and a[key] or b[key]
。你需要遍历字典 a 和字典 b 中的所有键。扩展字典,用
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 中新增的。