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

Can I trust the order of a dict to remain the same each time it is iterated over?

我有以下三个字符串(它们是独立存在的,这里为了方便一起显示):

from mx2.x.org (mx2.x.org. [198.186.238.144])
            by mx.google.com with ESMTPS id g34si6312040qgg.122.2015.04.22.14.49.15
            (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
            Wed, 22 Apr 2015 14:49:16 -0700 (PDT)

from HQPAMAIL08.x.org (10.64.17.33) by HQPAMAIL13.x.x.org
 (10.34.25.11) with Microsoft SMTP Server (TLS) id 14.2.347.0; Wed, 22 Apr
 2015 17:49:13 -0400

from HQPAMAIL13.x.org ([fe80::7844:1f34:e8b2:e526]) by
 HQPAMAIL08.iadb.org ([fe80::20b5:b1cb:9c01:aa86%18]) with mapi id
 14.02.0387.000; Wed, 22 Apr 2015 17:49:12 -0400

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

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

IPs =[]
fullStrings =[]
for string in strings:
    IPs.append[$theIpAddressFoundInTheString]
    fullstrings.append[$theWholeString]

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

IPs ['198.186.238.144', '10.64.17.33', 'fe80::7844:1f34:e8b2:e526']

fullstrings ['from mx2.x.org (mx2.x.org. [198.186.238.144])
                by mx.google.com with ESMTPS id g34si6312040qgg.122.2015.04.22.14.49.15
                (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
                Wed, 22 Apr 2015 14:49:16 -0700 (PDT)', 'from HQPAMAIL08.x.org (10.64.17.33) by HQPAMAIL13.x.x.org
     (10.34.25.11) with Microsoft SMTP Server (TLS) id 14.2.347.0; Wed, 22 Apr
     2015 17:49:13 -0400', 'from HQPAMAIL13.x.org ([fe80::7844:1f34:e8b2:e526]) by
     HQPAMAIL08.x.org ([fe80::20b5:b1cb:9c01:aa86%18]) with mapi id
     14.02.0387.000; Wed, 22 Apr 2015 17:49:12 -0400']

这在某一点之前一直运行良好,但现在当我开始使用这些列表中的值(在硬编码索引处)填充 dict 时,与其他列表中的值进行比较(再次在硬编码索引)等,不仅调试变得痛苦,代码变得不可持续。

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

for k,v in myDictOfIpsAndStrings:
    anotherDict[$someHardcodedText] = k
    anotherDict[$otherHardcodedText] = v        

这是我的顾虑:我能确定字典在任何时候被迭代时总是按照创建字典的顺序完成吗?如果不能, 是我恢复列表的唯一选择(以及乏味和 脆弱的 长度比较,这样做固有的分配)等等?

我知道字典就其本质而言是未排序的。我知道 sorted 函数,但我不想按任何 descending/ascending 顺序等对它们的键进行排序。而是关于维护(以某种方式)创建字典的顺序。

can I be sure that the dict, any time it is iterated over, will always be done in the order in which the dict was created?

不,dict 是无序的,并且会按照特定的实现决定的方式安排其顺序。

>>> d = {3: 'c', 2: 'b', 1: 'a'}
>>> d
{1: 'a', 2: 'b', 3: 'c'}

看,在我创建 dict 之后,订单立即发生了变化。

如果你想确保你有一个确定的、可控的顺序,你可以使用 collections.OrderedDict

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

您仍然可以按照您习惯的惯例访问 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')])

你不应该依赖字典的迭代顺序。 只有你可以获得任何稳定和可重复的排序的方法是做类似的事情:

for key in sorted(yourdict):
   more code here

这会给你一个稳定的顺序,但可能不是你想要的。

您可能想使用 OrderedDict