web-dev-qa-db-ja.com

Pythonで連想配列(辞書ではない)を実装するにはどうすればよいですか?

Pythonで辞書を印刷しようとしています:

Dictionary = {"Forename":"Paul","Surname":"Dinh"}
for Key,Value in Dictionary.iteritems():
  print Key,"=",Value

アイテム「Forename」が最初にリストされていますが、Python らしいの辞書は値でソートされているため、結果は次のようになります。

Surname = Dinh
Forename = Paul

コード内で同じ順序でこれらを印刷する方法またはアイテムが追加される順序(値やキーでソートされていない)?

8
jondinham

タプルのリスト(またはリストのリスト)を使用できます。このような:

Arr= [("Forename","Paul"),("Surname","Dinh")]
for Key,Value in Arr: 
    print Key,"=",Value

Forename = Paul
Surname = Dinh

これから辞書を作ることができます:

Dictionary=dict(Arr)

そして、このように正しくソートされたキー:

keys = [k for k,v in Arr]

次に、これを行います。

for k in keys: print k,Dictionary[k]

しかし、私はあなたの質問に対するコメントに同意します:代わりにループするときに必要な順序でキーをソートするのは簡単ではないでしょうか?

編集:(ありがとうRik Poggi)、OrderedDictこれはあなたのために行います:

od=collections.OrderedDict(Arr)
for k in od: print k,od[k]
16
Johan Lundberg

まず第一に、辞書はまったくソートされておらず、キーによっても値によってもソートされていません。

そして、あなたの説明に基づいて。あなたは実際に必要です collections.OrderedDict モジュール

from collections import OrderedDict

my_dict = OrderedDict([("Forename", "Paul"), ("Surname", "Dinh")])

for key, value in my_dict.iteritems():
    print '%s = %s' % (key, value)

OrderedDictがインスタンス化される前に、dictインスタンスがアイテムの順序をシャッフルするため、別のdictからではなくタプルのリストからOrderedDictをインスタンス化する必要があることに注意してください。

16
lig

collections.OrderedDict 。 python2.7とpython3.2 +で利用できます。

6
strcat

これはあなたのニーズをよりよく満たすかもしれません:

Dictionary = {"Forename":"Paul","Surname":"Dinh"}
KeyList = ["Forename", "Surname"]
for Key in KeyList:
    print Key,"=",Dictionary[Key]
4
Felix Yan

あなたが望むのはordered dictであるかどうか疑問に思います:

>>> k = "one two three four five".strip().split()
>>> v = "a b c d e".strip().split()
>>> k
  ['one', 'two', 'three', 'four', 'five']
>>> v
  ['a', 'b', 'c', 'd', 'e']
>>> dx = dict(Zip(k, v))
>>> dx
   {'four': 'd', 'three': 'c', 'five': 'e', 'two': 'b', 'one': 'a'}
>>> for itm in dx: 
        print(itm)

   four
   three
   five
   two
   one

>>> # instantiate this data structure from OrderedDict class in the Collections module
>>> from Collections import OrderedDict
>>> dx = OrderedDict(Zip(k, v))
>>> for itm in dx:
        print(itm)

   one
   two
   three
   four
   five 

OrderdDict を使用して作成された辞書は、元の挿入順序を保持します。

言い換えると、このようなディクショナリは、挿入された順序に従ってキーと値のペアを繰り返し処理します。

したがって、たとえば、キーを削除してから同じキーを再度追加すると、反復順序は次のようになります。

>>> del dx['two']
>>> for itm in dx:
        print(itm)

       one
       three
       four
       five

>>> dx['two'] = 'b'
>>> for itm in dx:
        print(itm)

       one
       three
       four
       five
       two
3
doug

'しかし、Pythonの辞書は値でソートされています'多分私はここで間違っていますが、あなたはどのゲームを考えていますか?辞書は何もソートされていません。

ディクショナリに追加のキーのリストを保持するか、1つまたは複数の配列などの異なるデータ構造を使用するかの2つの解決策があります。

3
Bogdan