3

我正在使用 Python 和 Django,并且将 JSON 对象作为 Python 字典返回,但我并不满意,因为我无法按照插入的顺序遍历字典的元素。

如果我按如下方式创建字典:

measurements = {
  'units': 'imperial',
  'fit': request.POST[ 'fit' ],
  'height': request.POST[ 'height' ],
  'weight': request.POST[ 'weight' ],
  'neck': request.POST[ 'neck' ],
  # further elements omitted for brevity
}

我可以尝试像这样迭代它:

for k,v in measurements.iteritems():
  print k, 'corresponds to ', v

结果是:

shoulders corresponds to  shoulders_val
weight corresponds to  weight_val
height corresponds to  height_val
wrist corresponds to  wrist_val
...

我还尝试使用 sorted(),它按字母顺序遍历我的元素

bicep corresponds to  bicep_val
chest corresponds to  chest_val
fit corresponds to  fit_val
height corresponds to  height_val
...

我是 Python 新手。我希望找到某种方法来通过命名键(如measurements['units'])引用我的字典元素,但仍然能够按照它们的创建顺序遍历这些元素。我知道那里有一个有序的字典模块,但我想远离非标准包。任何其他标准 Python 数据结构(列表、数组等)是否允许我按插入顺序迭代并通过命名键引用值?

4

2 回答 2

7

collections.OrderedDict如果您使用的是 py2.7 或更新版本, 您可以使用 a来保留插入顺序。这是标准库的一部分。对于旧版本,有一个activestate 配方浮动,您可以将其复制并用作您的包/模块的一部分。否则,标准库中没有任何东西可以做到这一点。

您可以对dict自己进行子类化并使其记住插入的顺序——例如将信息存储在列表中——但是当标准库中已经存在一些新版本的东西和你可以复制的配方时,这就太过分了如果您想支持旧版本,/paste 很容易获得。


请注意,如果您将字典传递给它们,则接受字典 ( __init__, update) 的字典方法将无法正确排序:

import collections
dd = collections.OrderedDict({
  'units': 'imperial',
  'fit': 'fit' ,
  'height': [ 'height' ],
  'weight': [ 'weight' ],
  'neck': [ 'neck' ],
})

print( dd )  #Order not preserved


#Pass an iterable of 2-tuples to preserve order.
ddd = collections.OrderedDict([
  ('units', 'imperial'),
  ('fit', 'fit') ,
  ('height', [ 'height' ]),
  ('weight', [ 'weight' ]),
  ('neck', [ 'neck' ]),
])

print( ddd ) #Order preserved
于 2012-11-06T19:47:48.253 回答
5

OrderedDictcollections模块中,这是核心 Python 发行版的重要组成部分(至少,正如 mgilson 指出的,在 2.7+ 中)。

OrderedDict 在 CPython 2.7、3.1、3.2 和 3.3 中默认可用。它在 2.5、2.6 或 3.0 中不存在。

于 2012-11-06T19:47:37.380 回答