Python字典、列表、连接和解释器

Python字典、列表、连接和解释器,python,python-2.7,list,python-3.x,dictionary,Python,Python 2.7,List,Python 3.x,Dictionary,join在python中连接字典中的列表元素和键,对吗 每当我使用join加入列表时,输出的顺序与列表的顺序相同我知道它没有排序,当我在文件和解释器中给出相同的结果时,输出明显不同 我的问题是,解释器如何记住这一点,并每次为该顺序提供相同的输出。它是在某种缓存中还是??? >>> x = ['a','b','c'] >>> ','.join(x) 'a,b,c' >>> x = ['c','b','a'] >>> ','.j

join在python中连接字典中的列表元素和键,对吗

每当我使用join加入列表时,输出的顺序与列表的顺序相同我知道它没有排序,当我在文件和解释器中给出相同的结果时,输出明显不同

我的问题是,解释器如何记住这一点,并每次为该顺序提供相同的输出。它是在某种缓存中还是???

>>> x = ['a','b','c']
>>> ','.join(x)
'a,b,c'
>>> x = ['c','b','a']
>>> ','.join(x)
'c,b,a'
使用口述

>>> z = {'a':3,'b':1,'c':4,'d':2}
>>> ','.join(z)
'b,d,a,c'
>>> z = {'a':3,'d':1,'c':4,'b':2}
>>> ','.join(z)
'c,d,a,b' 
因此,我得出结论,它每次都会变化,但当我在几条指令后给出具有特定顺序的同一词典时,它仍然以某些顺序显示输出,这在解释器中每次都是相同的

>>> z = {'foo':3,'bar':1,'egg':4,'spam':2}
>>> ','.join(z)
'egg,bar,foo,spam'
>>> z = {'bar':3,'foo':1,'egg':4,'spam':2}
>>> ','.join(z)
'egg,bar,foo,spam'
>>> z = {'bar':3,'foo':1,'spam':4,'egg':2}
>>> ','.join(z)
'spam,bar,foo,egg'
>>> z = {'foo':3,'bar':1,'egg':4,'spam':2}
>>> ','.join(z)
'egg,bar,foo,spam'
我可能遗漏了什么,但翻译是怎么记住的呢。清楚的解释将大有帮助

注意:如chris_rands提到的评论所示 我引用“dict迭代在解释器会话中是固定的,因为环境变量pythonhasheed是固定的”


更接近于我所寻找的答案。解释就好了

词典在python中没有顺序。您可能会随机获得相同的订单,但不能保证。如果您需要固定顺序的词典,请查看
orderedict

您可以使用,然后加入

from sortedcontainers import SortedDict
z={'egg': 4, 'foo': 3, 'bar': 1, 'spam': 2}
','.join(SortedDict(z))
#'bar,egg,foo,spam'
在自然情况下:

','.join(dict(SortedDict(z)))   #or   ','.join(z)
#'egg,foo,bar,spam'

字典并没有这种排序的意义。Python字典永远不会维持顺序。如果你想保持字典的顺序,请在3.6中使用
Collections
@voidpro中的
OrderedDict
-他们确实保留声明的顺序-在此之前-不。JonClements我同意这不是一个重复(或至少不是那个重复)。我认为,
dict
迭代在解释器会话中是固定的,可能是因为环境变量
pythonhasheed
是固定的fixed@s_vishnu我不确定这是否是正确的解释,如果我有时间的话,我会在Python版本>3.6:)中研究它