3

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

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

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

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

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

我发现最接近的是这篇文章:组合两个列表并删除重复项,而不删除原始列表中的重复项

但这并不像我想要的那样工作。

另一个例子:

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

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

2 回答 2

9

据我了解您的问题,您希望每个数字以它出现在任何输入列表中的最大频率出现在结果中。您可以使用 acollections.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()它来获取一个列表。

于 2013-10-08T11:59:18.753 回答
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]
于 2013-10-08T12:00:07.767 回答