问题描述
您提到的设置操作是:
{'1', '2', '3'} ^ {'2', '3', '4'} = {'1', '4'}
返回具有该集合和所有其他元素的新集合。
{'1', '2', '3'} | {'2', '3', '4'} = {'1', '2', '3', '4'}
python中还有其他set操作:
返回一个新集合,其中包含该集合和所有其他集合共同的元素。
{'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
集合的字符串表示形式中显示的任何顺序都是实现细节,因此不应依赖,因为正如您所发现的那样,它会以不可预测的方式变化。
解决方法
我在Pluralsight上看到了这个测试问题:
鉴于这些设置:
x = {'a','b','c','d'}
y = {'c','e','f'}
z = {'a','g','h','i'}
的值是x | y ^ z
多少?
预期的答案是:
{'a','d','f','i'}
组合集合(自动丢弃重复项),并从最低到最大对它们进行排序。
我的问题是:
- 这个表达式叫什么?
- 为什么从3个不同的Python版本中得到3个不同的结果?
在Ubuntu 18.04上的Python 3.7.5上的结果:
{'c','i','a','e'}
在Ubuntu 18.04上使用Python 2.17.17rc1的结果:
set(['a','h'])
Windows 10上Python 3.7.2的结果:
{'a','i'}
这是我为此使用的相同代码的副本:https :
//repl.it/repls/RudeMoralWorkplace
我想了解这些表达式在幕后发生的事情,因此我可以揭穿为什么我得到不同结果的想法。