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.OrderedDictpy2.7以降を使用している場合は、を使用して挿入順序を保持 できます。これは標準ライブラリの一部です。古いバージョンの場合、パッケージ/モジュールの一部としてコピーして使用できるアクティブステートレシピが浮かんでいます。そうでなければ、それを行う標準ライブラリには何もありません。

自分でサブクラス化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

OrderedDictモジュール内にありcollectionsます。これは、コア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 に答える