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

时间:2015-06-11 17:02:57

标签: python list dictionary iteration

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

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

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

鉴于顺序很重要,我决定使用列表,并且最初做了类似的事情(伪代码,上面有一堆文字):

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']

产生以下两个列表(再次,只是说明):

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

这已经很好了直到某一点,但现在我开始使用这些列表中的值(在硬编码索引处)填充 dict ,与其他列表中的值进行比较(同样在硬编码索引处)等等,不仅调试变得痛苦,代码变得不可持续。

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

sorted

这是我的担忧:我可以确定dict,无论何时迭代,都将按照dict创建的顺序完成?如果没有,是我唯一的选择恢复到列表(以及繁琐和脆弱长度比较,这样做所固有的分配)等等。

我知道dict本质上是未分类的。我知道{{1}}函数,但我不打算按任何降序/升序等对它们进行排序,而是关于维护(不知何故)dict的创建顺序。

2 个答案:

答案 0 :(得分:9)

  

我可以确定dict,无论何时迭代,都将按照创建dict的顺序完成?

不,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')])

答案 1 :(得分:4)

您不应该依赖于dict的迭代顺序。 唯一方式可以获得任何稳定且可重复的排序,例如:

for key in sorted(yourdict):
   more code here

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

您可能想要使用OrderedDict