3

私はPythonで辞書を作成しようとしていますが、キーが入ったときにキーの順序を保持したいと思います-リストのように正確にFIFOします。

例えば、

次の情報を含むanimals.txtというファイルを読みました。

animal\tconservation_status\n
dog\tdomesticated\n
tiger\tEN\n
panda\tEN\n

すなわち、

animals = {'dog':'dom','tiger':'EN', 'panda':'EN'}
>>> for el in animals:
...     print el
... 
tiger
dog
panda

そして、先入れ先出しでは、犬、トラ、パンダが出てきたはずです...

辞書に読み込むと、順序は保持されません。forループを実行するときにFIRST INがFIRST OUTになるように順序を維持したいと思います。

つまり、犬、トラ、パンダの順です。

外部インデックスやより複雑な辞書構造を保持することなくこれを行う良い方法はありますか? わかりません、ここで私の素朴さを申し訳ありません...

4

1 に答える 1

8

はい。通常の辞書の代わりにcollections.OrderedDictを使用します。

>>> d = OrderedDict((x,x) for x in reversed(range(10)) )
>>> d
OrderedDict([(9, 9), (8, 8), (7, 7), (6, 6), (5, 5), (4, 4), (3, 3), (2, 2), (1, 1), (0, 0)])
>>> regular = dict((x,x) for x in reversed(range(10)))
>>> regular
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}

OrderedDictは順序を保持するのに対し、通常のものは保持dictしないことに注意してください。


>>> OrderedDict([('dog','dom'),('tiger','EN'), ('panda','EN')])
OrderedDict([('dog', 'dom'), ('tiger', 'EN'), ('panda', 'EN')])

.updateもう 1 つの落とし穴は、順序を保持する方法で項目をコンストラクター (または ) に渡す必要があることです。つまり、キーワード引数をコンストラクターに渡して、順序が保持されることを期待することはできません。

>>> OrderedDict(dog='dom',tiger='EN',panda='EN')  #doesn't preserve order
OrderedDict([('tiger', 'EN'), ('panda', 'EN'), ('dog', 'dom')])
于 2013-03-01T17:45:08.713 に答える