2013-03-01 74 views
2

我想在python中填充一個字典,但我想保留鍵的順序,因爲他們進來 - 確切的FIFO像列表會做到這一點。Python中的FIFO順序的pythonic方式

例如,

我讀了一個名爲包含以下信息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 

而且在FIFO應該是狗,虎,他們出來的熊貓...

當我把它讀入字典的順序將不會被保留。我希望這個命令能夠被保留,這樣當我做一個for循環時,FIRST IN是第一個輸出。

即, 狗,然後老虎,然後熊貓。

有沒有一種很好的方式來做到這一點,而不必保留外部索引或更復雜的字典結構?不知道,在這裏對我的天真抱歉...

回答

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)。換句話說,您不能將關鍵字參數傳遞給構造函數,並期望保留順序:

>>> OrderedDict(dog='dom',tiger='EN',panda='EN') #doesn't preserve order 
OrderedDict([('tiger', 'EN'), ('panda', 'EN'), ('dog', 'dom')]) 
+0

謝謝,完美的作品! – Dnaiel 2013-03-01 17:50:59