这些集合操作是啥,为啥它们会给出不同的结果?
Posted
技术标签:
【中文标题】这些集合操作是啥,为啥它们会给出不同的结果?【英文标题】:What are these set operations, and why do they give different results?这些集合操作是什么,为什么它们会给出不同的结果? 【发布时间】:2020-05-22 19:06:07 【问题描述】:我在 Pluralsight 上看到过这个测试题:
鉴于这些集合:
x = 'a', 'b', 'c', 'd'
y = 'c', 'e', 'f'
z = 'a', 'g', 'h', 'i'
x | y ^ z
的值是多少?
预期的答案是:
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'
组合集合(自动丢弃重复项),并将它们从最低到最高排序。
我的问题是:
这个表达式叫什么? 为什么我会从 3 个不同的 Python 版本中得到 3 个不同的结果?Ubuntu 18.04 上 Python 3.7.5 的结果:
'c', 'h', 'f', 'd', 'b', 'i', 'g', 'a', 'e'
Ubuntu 18.04 上 Python 2.17.17rc1 的结果:
set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h'])
Windows 10 上 Python 3.7.2 的结果:
'a', 'd', 'h', 'f', 'b', 'g', 'e', 'c', 'i'
这是我为此使用的相同代码的副本: https://repl.it/repls/RudeMoralWorkplace
我想了解这些表达式在幕后发生了什么,这样我就可以揭穿为什么会得到不同的结果。
【问题讨论】:
【参考方案1】:你提到的集合操作是:
^
- symmetric difference(异或):
返回一个新集合,其中包含集合中的元素或其他元素,但不能同时包含两者。
示例: '1', '2', '3' ^ '2', '3', '4' = '1', '4'
|
- union(或):
返回一个包含集合中元素和所有其他元素的新集合。
示例: '1', '2', '3' | '2', '3', '4' = '1', '2', '3', '4'
python中还有其他的集合操作:
&
- intersection(与):
返回一个新集合,其中包含集合和所有其他元素共有的元素。
示例: '1', '2', '3' & '2', '3', '4' = '2', '3'
-
- difference:
返回一个新集合,该集合中的元素不在其他集合中。
示例: '1', '2', '3' - '2', '3', '4' = '1'
这些操作的优先顺序是-, &, ^, |
,所以在你的例子中,我们先申请^
:
>>> y^z
'a', 'c', 'e', 'f', 'g', 'h', 'i'
然后|
:
>>> x|'a', 'c', 'e', 'f', 'g', 'h', 'i'
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'
您描述的不同输出实际上是相同的集合,因为集合没有排序。
>>> 'c', 'h', 'f', 'd', 'b', 'i', 'g', 'a', 'e' == 'a', 'd', 'h', 'f', 'b', 'g', 'e', 'c', 'i'
True
集合的字符串表示中显示的任何顺序都是实现细节,不应依赖它,因为它会发生不可预测的变化,正如您所发现的那样。
【讨论】:
忘记接受这个答案,但感谢您的冗长!答案是abcd
在这里有点牵强。以上是关于这些集合操作是啥,为啥它们会给出不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章
Python append() 与列表上的 + 运算符,为啥这些会给出不同的结果?