【问题标题】:How to get difference between two lists using sets如何使用集合获得两个列表之间的差异
【发布时间】:2018-11-05 22:28:32
【问题描述】:

为什么会这样:

a = ["one", "two","three"]
b = ["one","three"]
c = set(a)-set(b)
d = set(b)-set(a)
e = []
e.append(d)
e.append(c)

这不是:

example = set(set([a])-set([b])) + set(set([b])-set([a]))

我知道,就索引数量而言,第一种情况会产生与第二种情况不同的结果。

如何在不使用联合或符号项的情况下使用集合制作第二个版本。

期望的输出:做一个最终的列表,你会得到:

output = ["two"]

基本上只使用 set 函数找到不常见的元素,并使其成为一个衬里。

【问题讨论】:

  • 为什么不只是set(a).symmetric_difference(b)
  • 我不明白你为什么有这两个额外的集合调用。为什么不只是(set([a])-set([b])) + (set([b])-set([a])
  • @DanielRoseman 如果我这样做,我会得到:TypeError: unhashable type: 'list'

标签: python list set


【解决方案1】:

这是一个愚蠢的错误:

>>> a=["one", "two", "three"]
>>> set(a)
set(['three', 'two', 'one'])
>>> set([a])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

注意对set() 的两次调用之间的区别:一个传递列表,另一个创建一个包含子列表的列表并传递它。

(一旦你解决了这个问题,你将不得不解决你不能添加集的事实:

不使用联合

+ 运算符未在集合上定义,但如果是,它可能是联合运算符。)

【讨论】:

  • 如果我这样做:(set(a)-set(b)) + (set(b)-set(a)) 我得到不支持的 + 操作数类型:'set' 和 'set'
  • 对,因为集合不支持加法。 (数学上,{2, 3} + {orange} 是什么?两者的附加。
  • 是的,但是为什么会这样呢? set(list(s) + list(t)) 以及如何在我的代码中实现它?
  • 您可以使用list 将任何集合转换为列表,并使用set 将任何哈希表项列表转换为集合(删除重复项),因为listset 构造函数采用任何可迭代的。这就是您在工作样本中所做的。因此,要制作一条线,请考虑这样做。
  • 顺便说一句,这个特定的问题看起来像是一个家庭作业,这可能就是为什么没有其他人提供单行。 :-)
【解决方案2】:

一个班轮:

list(set(a) - set(b)) # ["two"]

【讨论】:

    猜你喜欢
    • 2020-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-24
    • 2022-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多