这些集合操作是什么,为什么它们会给出不同的结果?
What are these set operations, and why do they give different results?
我在 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 个不同的结果?
Python 3.7.5 在 Ubuntu 18.04 上的结果:
{'c', 'h', 'f', 'd', 'b', 'i', 'g', 'a', 'e'}
Python2.17.17rc1 在Ubuntu18.04 上的结果:
set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h'])
Python3.7.2 在Windows10 上的结果:
{'a', 'd', 'h', 'f', 'b', 'g', 'e', 'c', 'i'}
这是我为此使用的相同代码的复制:
https://repl.it/repls/RudeMoralWorkplace
我想了解这些表达式在幕后发生了什么,这样我就可以揭穿为什么我会得到不同的结果。
您提到的集合操作是:
^
- symmetric difference (异或):
Return a new set with elements in either the set or other but not both.
示例: {'1', '2', '3'} ^ {'2', '3', '4'} = {'1', '4'}
|
- union(或):
Return a new set with elements from the set and all others.
示例: {'1', '2', '3'} | {'2', '3', '4'} = {'1', '2', '3', '4'}
python中还有其他集合操作:
&
- intersection (AND):
Return a new set with elements common to the set and all others.
示例: {'1', '2', '3'} & {'2', '3', '4'} = {'2', '3'}
-
- difference:
Return a new set with elements in the set that are not in the others.
示例: {'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
集合的字符串表示中显示的任何顺序都是一个实现细节,不应依赖它,因为它会发生不可预测的变化,如您所见。
我在 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 个不同的结果?
Python 3.7.5 在 Ubuntu 18.04 上的结果:
{'c', 'h', 'f', 'd', 'b', 'i', 'g', 'a', 'e'}
Python2.17.17rc1 在Ubuntu18.04 上的结果:
set(['a', 'c', 'b', 'e', 'd', 'g', 'f', 'i', 'h'])
Python3.7.2 在Windows10 上的结果:
{'a', 'd', 'h', 'f', 'b', 'g', 'e', 'c', 'i'}
这是我为此使用的相同代码的复制: https://repl.it/repls/RudeMoralWorkplace
我想了解这些表达式在幕后发生了什么,这样我就可以揭穿为什么我会得到不同的结果。
您提到的集合操作是:
^
- symmetric difference (异或):
Return a new set with elements in either the set or other but not both.
示例: {'1', '2', '3'} ^ {'2', '3', '4'} = {'1', '4'}
|
- union(或):
Return a new set with elements from the set and all others.
示例: {'1', '2', '3'} | {'2', '3', '4'} = {'1', '2', '3', '4'}
python中还有其他集合操作:
&
- intersection (AND):
Return a new set with elements common to the set and all others.
示例: {'1', '2', '3'} & {'2', '3', '4'} = {'2', '3'}
-
- difference:
Return a new set with elements in the set that are not in the others.
示例: {'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
集合的字符串表示中显示的任何顺序都是一个实现细节,不应依赖它,因为它会发生不可预测的变化,如您所见。