【问题标题】:find the non intersection between 2 list, including duplicate查找 2 个列表之间的非交集,包括重复项
【发布时间】:2020-02-01 18:20:26
【问题描述】:

我在询问之前尝试查找此问题,但找不到任何令人满意的问题。所以我有 2 个这样的列表

a=[1,2,3,4,4]
b=[1,1,2,3,4]

我试过了:

set(a) - set(b)

但是得到了这个

set()

我想要的是这个

[1,4]

因为集合 a 有 2 个 4,集合 b 有 2 个 1。我能做些什么?谢谢!

【问题讨论】:

  • "set a has 2 4s" - 不,它没有,set 没有重复,只要你使用set,set a 就有一个4,同样对于1s的集合b
  • 好的,谢谢,那我该怎么办?
  • 但是即使它们是多重集合(数学术语),那么 set(a) - set(b) 也只有一个元素 4。请说明您想要什么,因为您的输出与您的尝试不匹配。
  • 我要的是a+b - (a∩b)
  • 您应该在问题中包含您的评论。

标签: python multiset


【解决方案1】:

collections.Counter对象比较各个值的出现:

from collections import Counter

a = [1, 2, 3, 4, 4]
b = [1, 1, 2, 3, 4]
a_counts, b_counts = Counter(a), Counter(b)
res = [a_key for a_key, b_key in zip(a_counts, b_counts)
       if a_counts[a_key] != b_counts[b_key]]

print(res)   # [1, 4]

【讨论】:

    【解决方案2】:

    使用collections.Counter,是一个multiset的Python实现:

    from collections import Counter
    
    a = [1, 2, 3, 4, 4]
    b = [1, 1, 2, 3, 4]
    c = [1, 1, 1, 2, 3, 4]
    
    counts_a = Counter(a)
    counts_b = Counter(b)
    counts_c = Counter(c)
    
    result_b = (counts_a | counts_b) - (counts_a & counts_b)
    result_c = (counts_a | counts_c) - (counts_a & counts_c)
    
    print(list(result_b.elements()))
    print(list(result_c.elements()))
    

    输出

    [1, 4]
    [1, 1, 4]
    

    请注意,(counts_a | counts_b) - (counts_a & counts_b) 是数学公式的 Python 等价物。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-18
      • 2012-10-31
      • 2015-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-14
      相关资源
      最近更新 更多