Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我能相信dict的顺序在每次迭代时都保持不变吗?_Python_List_Dictionary_Iteration - Fatal编程技术网

Python 我能相信dict的顺序在每次迭代时都保持不变吗?

Python 我能相信dict的顺序在每次迭代时都保持不变吗?,python,list,dictionary,iteration,Python,List,Dictionary,Iteration,我有以下三个字符串(它们独立存在,但为了方便起见在此处一起显示): 我希望根据字符串的倒序(从下到上)用一些值填充dict。具体来说,对于每个字符串,我提取IP地址作为排序索引,然后提取完整字符串作为值 考虑到顺序很重要,我决定使用列表,最初做了类似的事情(伪代码,上面有一堆文本): 产生以下两个列表(同样,只是一个示例): 这在某种程度上一直很有效,但现在,当我开始用这些列表中的值(在硬编码索引中)填充一个dict,并与其他列表中的值(同样在硬编码索引中)等进行比较时,调试不仅变得痛苦,而且代

我有以下三个字符串(它们独立存在,但为了方便起见在此处一起显示):

我希望根据字符串的倒序(从下到上)用一些值填充dict。具体来说,对于每个字符串,我提取IP地址作为排序索引,然后提取完整字符串作为值

考虑到顺序很重要,我决定使用列表,最初做了类似的事情(伪代码,上面有一堆文本):

产生以下两个列表(同样,只是一个示例):

这在某种程度上一直很有效,但现在,当我开始用这些列表中的值(在硬编码索引中)填充一个dict,并与其他列表中的值(同样在硬编码索引中)等进行比较时,调试不仅变得痛苦,而且代码变得不可持续

我开始使用dict重写(返回一个dict,其中IP地址是键,完整字符串是值)。然后我将执行如下操作:

for k,v in myDictOfIpsAndStrings:
    anotherDict[$someHardcodedText] = k
    anotherDict[$otherHardcodedText] = v        
这是我的担忧:我能确保dict在任何时候被迭代,都将按照dict创建的顺序进行吗?如果不能,这是我返回列表的唯一选择(以及繁琐且脆弱的长度比较、这样做所固有的赋值)等等

我知道,从本质上讲,口述是不分类的。我知道排序功能,但我不想按降序/升序等顺序对它们进行排序,而是要(以某种方式)保持dict创建的顺序

我能保证dict在任何时候被迭代,总是按照dict创建的顺序进行吗

否,
dict
是无序的,它将按照特定实现决定的顺序进行排列

>>> d = {3: 'c', 2: 'b', 1: 'a'}
>>> d
{1: 'a', 2: 'b', 3: 'c'}
看,在我创建了
dict
之后,顺序立即改变了

如果您想确保您有一个确定性的、可控的顺序,您可以使用

您仍然可以访问您习惯的约定中的
OrderedDict

>>> d[3]
'c'
>>> d.get(3)
'c'
请注意,创建时不必插入所有元素。如果需要,可以一次插入一个

>>> d = OrderedDict()
>>> d[3] = 'c'
>>> d[2] = 'b'
>>> d[1] = 'a'
>>> d[4] = 'd'
>>> d
OrderedDict([(3, 'c'), (2, 'b'), (1, 'a'), (4, 'd')])

您不应依赖dict的迭代顺序。获得任何稳定且可重复的顺序的唯一方法是执行以下操作:

for key in sorted(yourdict):
   more code here
这将为您提供稳定的订单,但可能不是您想要的


您可能想使用使用
集合。OrderedDict
!你的问题不清楚。你希望维持什么秩序?插入元素的顺序?或者当您多次迭代时,迭代的顺序不会改变?插入顺序没有保留,但是一旦你有了字典,顺序会保持稳定,直到你插入更多的键(或删除键)。@minitech谢谢。文档包含“新版本2.7”中的行,但是它被埋藏在降序的中间。我应该将此理解为OrderedDict在2.7中是新的,还是只有popitem()方法是新的?@Pyderman:OrderedDict在2.7中是新的。@Pyderman:see;字典不保留创建它或向它添加键的顺序。因此,在Python中输入
{'foo':1,'bar':2,'baz':3}
将为您提供
{'baz':3,'bar':2,'foo':1}
,对该字典的迭代将始终为您提供
'baz'
第一、
'bar'
第二和
'foo'
第三个。直到插入更多关键点或从中删除关键点。样本中的顺序特定于2.7,没有散列种子随机。您可能希望提及
OrderedDict
,如果您的解释正确,它将非常适合用例。您可以依赖dict的迭代顺序,前提是您不插入或删除任何内容。您不能依赖的是插入顺序被保留。@MartijnPieters Ok。见我上面的问题。我想如果我想利用这方面的优势,我需要一次性填充dict。@MartijnPieters谢谢-这是一个重要的观点。直到现在,我还以为是dicts的迭代导致了顺序的改变。
>>> from collections import OrderedDict
>>> d = OrderedDict([(3, 'c'), (2, 'b'), (1, 'a')])
>>> d
OrderedDict([(3, 'c'), (2, 'b'), (1, 'a')])
>>> d[3]
'c'
>>> d.get(3)
'c'
>>> d = OrderedDict()
>>> d[3] = 'c'
>>> d[2] = 'b'
>>> d[1] = 'a'
>>> d[4] = 'd'
>>> d
OrderedDict([(3, 'c'), (2, 'b'), (1, 'a'), (4, 'd')])
for key in sorted(yourdict):
   more code here