【问题标题】:How do i subtract two lists with non-unique elements in Python? [duplicate]如何在 Python 中减去两个具有非唯一元素的列表? [复制]
【发布时间】:2021-01-08 15:04:09
【问题描述】:

假设我有两个列表,例如:

list1 = ['a', 'c', 'a', 'b']
list2 = ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'd', 'e', 'f']

list_final = list2 - list1
list_final = ['a', 'a', 'c', 'd', 'e', 'f']

我不认为 set(lists) 和使用 .difference 的方法会有所帮助,因为它不是唯一的集合。 任何形式的帮助都将不胜感激,而且我是语言新手,因此欢迎任何和所有答案/提示!

【问题讨论】:

  • 所以list2 总是排序的?
  • 所有list1 元素总是至少在list2 中出现?

标签: python python-3.x


【解决方案1】:

list.remove 在这里应该足够了,尽管这不是最有效的方法,因为 .remove 具有 O(n) 复杂性。

list1 = ['a', 'c', 'a', 'b', 'k']
list2 = ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'd', 'e', 'f']

for e in list1:
    try:
        list2.remove(e)
    except ValueError:
        print(f'{e} not in list')

list2
# ['a', 'a', 'c', 'd', 'e', 'f']

【讨论】:

  • 明确地说,这在最坏的情况下是 O(n^2)。
  • @wjandrea O(m*n)。两个不同长度的列表。
  • O(n*m) 表示整个过程,O(n) 表示删除本身,对吧?
  • @khelwood 是的,谢谢,我自己也意识到了这一点。对于其他阅读者,m=len(list1), n=len(list2)。
  • @RobinFrcd 是的,完全正确
【解决方案2】:

如果顺序不重要,您可以将Counters 从列表中减去。

from collections import Counter

list1 = ['a', 'c', 'a', 'b']
list2 = ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'd', 'e', 'f']

final = Counter(list2) - Counter(list1)

print(list(final.elements()))  # -> ['a', 'a', 'c', 'd', 'e', 'f']

它被用作multiset

“顺序不重要”有一些注意事项,例如 Python 3.7+ 中的 dicts 将保留插入顺序,因此这里的输出是有序的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 2012-01-01
    • 2017-09-29
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多