我遇到一个问题,我无法找到一个好的答案: 我想合并两个列表,但保持每个对象的出现次数相同 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]
答案 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]