Python 为什么一组数字看起来是被排序的?
多次运行此代码Python 为什么一组数字看起来是被排序的?,python,set,python-3.4,Python,Set,Python 3.4,多次运行此代码 t = {'a', 'b', 'c', 'd'} print(t) 可以打印如下内容: {'c', 'b', 'a', 'd'} {'d', 'b', 'c', 'a'} # different {'d', 'b', 'c', 'a'} # same {'a', 'd', 'b', 'c'} # different {'a', 'b', 'c', 'd'} # different # etc (如果您正在使用控制台复制它,请确保每次重新粘贴代码并执行它之前都单击“重新运行”
t = {'a', 'b', 'c', 'd'}
print(t)
可以打印如下内容:
{'c', 'b', 'a', 'd'}
{'d', 'b', 'c', 'a'} # different
{'d', 'b', 'c', 'a'} # same
{'a', 'd', 'b', 'c'} # different
{'a', 'b', 'c', 'd'} # different
# etc
(如果您正在使用控制台复制它,请确保每次重新粘贴代码并执行它之前都单击“重新运行”。如果仍然无法复制,则可能您没有达到random
)
另一方面,下面的代码总是打印相同的集合,并且它实际上是经过排序的:
s = {1, 6, 3.3, 4}
print(s)
# prints:
# {1, 3.3, 4, 6}
# {1, 3.3, 4, 6}
# {1, 3.3, 4, 6}
# {1, 3.3, 4, 6}
问题:为什么一组数字看起来总是被排序的?它们真的总是被排序的吗 注意,我手头没有python3.4,但在python2.7上,情况并非总是如此(我希望python3.4也是如此) 我甚至可以根据我将元素放入集合的方式更改元素的顺序:
>>> print({1, 9})
set([9, 1])
>>> print({9, 1})
set([1, 9])
>>> set([9, 1])
set([9, 1])
>>> set([1, 9])
set([1, 9])
顺序由元素的散列和插入它的时间决定(在散列冲突的情况下)。在CPython中,整数散列到自身,一个dict/set有8个可用的插槽。因为有8个点可用,我们可以散列数字0->7(包括),而不会发生散列冲突。但是,如果我们尝试在同一集中散列8和0(或9和1),我们将遇到冲突。如果9
已经在集合中,然后我们尝试将1
放入,python会看一眼并说“哦,天哪,这个位置被占用了——现在我需要将它放入下一个最有利的位置”。碰撞解决方案的细节超出了我的研究范围,因此我无法深入了解这是什么插槽
注意,如果集合中有超过5个元素,那么它将被调整大小(IIRC,到16,然后32,然后64,…),这会改变哪些元素会发生碰撞(自然)。注意,
集合
基本上只是一个没有值的dict
。它似乎只在iPython控制台中排序,而不是在普通的python控制台中排序,当遍历它或调用str(s)
或repr(s)
时。另一个可能的重复:不打印将给您不同的ordering@PadraicCunningham不知道你的意思是什么?如果我做a={1,9};a
我仍然得到与python2.7上运行的print({1,9})
相同的东西,这是从ipython运行的,它似乎与python不同repl@PadraicCunningham--您正在使用IPython,它似乎试图为您提供帮助并对元素进行排序。如果只打印repr(s)
(这是普通python REPL将要做的)@padraiccanningham——真正让我吃惊的是{1,9}
和集([1,9])
给出了不同的结果。。。出于某种原因,似乎只涉及文本的python集是向后读取的?