什么决定了此python 3代码中set元素的顺序?

时间:2018-11-07 10:43:13

标签: python python-3.x set python-3.6

为什么只有在通过函数调用时才更改元素的顺序?是什么决定这个顺序?

$ python test_set_order.py
input is {'B', 'A'}
['B', 'A']
$ python test_set_order.py
input is {'B', 'A'}
['B', 'A']
$ python test_set_order.py
input is {'A', 'B'}
['A', 'B']
$ python test_set_order.py
input is {'B', 'A'}
['B', 'A']
$ python test_set_order.py
input is {'A', 'B'}
['A', 'B']
$ python test_set_order.py
input is {'A', 'B'}
['A', 'B']

执行上面的脚本会产生不同的输出:

python 3.6.5

这是在2.7.13上。在python >>> bla = {'A','B'}; print(bla) {'A', 'B'} >>> bla = {'A','B'}; print(bla) {'A', 'B'} >>> bla = {'A','B'}; print(bla) {'A', 'B'} >>> bla = {'A','B'}; print(bla) {'A', 'B'} >>> bla = {'A','B'}; print([i for i in bla]) ['A', 'B'] >>> bla = {'A','B'}; print([i for i in bla]) ['A', 'B'] >>> bla = {'A','B'}; print([i for i in bla]) ['A', 'B'] >>> bla = {'A','B'}; print([i for i in bla]) ['A', 'B'] >>> bla = {'A','B'}; print([i for i in bla]) ['A', 'B'] 上,您总是得到相同的订单

似乎仅在函数调用后顺序才会更改。以前没有发生过

$ python -c "print({'A', 'B'})"
{'B', 'A'}
$ python -c "print({'A', 'B'})"
{'A', 'B'}

更新:

似乎与散列有关,并且决定了解释器何时启动。这足以重现:

'A'.__hash__())

python 3的值每次在SyntaxError: Unexpected token . in JSON at position 1上改变

2 个答案:

答案 0 :(得分:1)

集合在Python中是无序的。您不应该期望一致性。

举一个简单的例子,在REPL for Python3(python -i)上,

>> x={3,1,2}
>>> print(x)
{1, 2, 3}

与Python2类似

>>> x={3,2,1}
>>> print(x)
set([1, 2, 3])

它们也不是简单地自动排序的,如下面的Python3示例:

>>> x={3,('a','b'), 'x',0.11,'y',None, 'z',4.11,('c','d')}
>>> print(x)
{0.11, 3, 'y', 4.11, ('c', 'd'), 'x', ('a', 'b'), None, 'z'}

如果希望它们保持插入顺序,请使用this之类的OrderedSet或仅重复使用OrderedDict

答案 1 :(得分:0)

因为by definition是一个无序对。如果要订购它们,请使用list

只需替换:

{'A', 'B'}

具有:

['A', 'B']

这是因为使用大括号{}创建了集合,并使用了括号[]定义了列表