这些设置操作是什么?为什么给出不同的结果?

时间:2020-02-06 16:55:49

标签: python python-3.x python-2.7 set set-operations

我在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 个答案:

答案 0 :(得分:8)

您提到的设置操作是:

^-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

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