python - 合并两个列表但保持相同的出现次数

时间:2013-10-08 11:45:00

标签: python list merge

我遇到一个问题,我无法找到一个好的答案: 我想合并两个列表,但保持每个对象的出现次数相同 EX:

list1 = [2,3,7]
list2 = [2,2,5]

合并两个列表后,结果应如下所示:

res = [2,2,3,5,7] #it does not need to be sorted

观察从一开始就有三个“2”但合并后应该只有两个“2”

我找到的最接近的帖子是Combining two lists and removing duplicates, without removing duplicates in original list

但这不符合我想要的方式。

另一个例子:

l1 = [2]
l2 = [3]
l3 = [2,2]
l4 = [5]
l5 = [2,3]

#after adding all the lists above
result = [2,2,3,5]

2 个答案:

答案 0 :(得分:9)

据我了解您的问题,您希望每个数字都显示在结果中,并显示在任何输入列表中的最大频率。您可以使用collections.Counter获取每个列表的频率,并使用|运算符合并它们:

>>> c = collections.Counter([2, 2, 5])
>>> d = collections.Counter([2, 3, 7])
>>> list((c | d).elements())
[2, 2, 3, 5, 7]

这是一个加入任意数量列表的功能:

def merge_max_frequency(*iterables):
    return reduce(operator.or_, map(collections.Counter, iterables)).elements()

此函数返回一个可迭代而不是一个列表 - 只需将list()应用于它就可以得到一个列表。

答案 1 :(得分:0)

感觉有点过于复杂,但这就是我要解决的问题:

>>> newlist = []
>>> for i,j in zip(list1, list2):
>>>    newlist.append(set([i,j]))
>>> [x for sub in newlist for x in sub]      # flattening the list of sets
[2, 2, 3, 5, 7]