【问题标题】:python - merge two lists but keep same number of occurrencespython - 合并两个列表但保持相同的出现次数
【发布时间】:2013-10-15 07:49:23
【问题描述】:

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

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]

【问题讨论】:

  • 合并后为什么只有两个?
  • 为两个列表创建一个计数器,并将每个条目的 max(counter1, counter2) 项输出到结果列表中。
  • 好吧,merging 可能是一个错误的词,但它是这样的:如果我们“合并”l1 和 l2,我们会得到 [2,3]。如果我们然后将新列表与 l3 “合并”,我们会得到 [2,2,3](只有两个 2)等等......
  • 当我们将[2,3][2,2,2,2,3] 合并时会发生什么?
  • 您的原始列表是否已排序?你关心算法效率吗? dornherge 的 Counter 解决方案应该可以工作,但如果对原始列表进行排序,则不会是最佳解决方案。除非你有数百万个元素,否则应该没关系。

标签: python list merge


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    感觉有点过于复杂,但这是我的解决方法:

    >>> 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]
    

    【讨论】:

    • 感谢您添加括号。
    猜你喜欢
    • 1970-01-01
    • 2015-11-26
    • 2014-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多