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

组合集合(自动丢弃重复项),并将它们从最低到最高排序。

我的问题是:

  • 这个表达式叫什么?
  • 为什么我从 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

我想了解这些表达式在幕后发生的事情,这样我就可以揭穿为什么会得到不同的结果。

4

1 回答 1

8

您提到的集合操作是:

^-对称差分(XOR):

返回一个新集合,其中包含集合或其他元素中的元素,但不能同时包含两者。

例子: {'1', '2', '3'} ^ {'2', '3', '4'} = {'1', '4'}

|-联合(或):

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

例子: {'1', '2', '3'} | {'2', '3', '4'} = {'1', '2', '3', '4'}

python中还有其他的set操作:

&-交叉点(AND):

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

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

集合的字符串表示中显示的任何顺序都是实现细节,不应依赖它,因为它会发生不可预测的变化,正如您所发现的。

于 2020-02-06T17:01:33.920 回答