这些集合操作是什么,为什么它们会产生不同的结果?

6

我曾在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'}

将集合合并(自动丢弃重复项),并按从小到大的顺序排序。

我的问题是:

  • 这个表达式叫什么?
  • 为什么我在三个不同的Python版本上得到了三个不同的结果?

在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'}

这是我用来进行此操作的相同代码的 Repl: https://repl.it/repls/RudeMoralWorkplace 我想了解这些表达式背后发生的事情,以便可以驳斥为什么我会得到不同的结果。
1个回答

8
您提到的集合操作有: ^ - 对称差集(XOR): 返回一个新的集合,其中包含两个集合中的元素但不包含两个集合都有的元素。 示例:{'1', '2', '3'} ^ {'2', '3', '4'} = {'1', '4'} | - 并集(OR): 返回一个新的集合,其中包含所有集合中的元素。 示例:{'1', '2', '3'} | {'2', '3', '4'} = {'1', '2', '3', '4'} Python 中还有其他集合操作:

& - 交集

返回一个新的集合,其中包含原集合和所有其他集合中共有的元素。

示例: {'1', '2', '3'} & {'2', '3', '4'} = {'2', '3'}

- - 差集

返回一个新的集合,其中包含原集合中不在其他集合中的元素。

示例: {'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

在集合的字符串表示中显示的任何顺序都是实现细节,不应该依赖它,因为它会因情况而异,正如您所发现的那样。


1
忘记采纳这个答案了,但是感谢您的详细解释!在这里,答案按顺序为abcd有点误导人。 - CodeSpent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接