字典中FIFO顺序的pythonic方式

时间:2013-03-01 17:44:25

标签: python dictionary

我正在尝试在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

在一个FIFO中应该是狗,虎,熊猫出来的时候......

当我将其读入字典时,订单将不会被保留。我希望保留顺序,以便当我执行for循环时,FIRST IN是FIRST OUT。

即, 狗,然后老虎,然后是熊猫。

有没有一种很好的方法可以做到这一点而无需保留外部索引或更复杂的字典结构?不确定,对不起我的天真......

1 个答案:

答案 0 :(得分: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)。换句话说,您不能将关键字args传递给构造函数并期望保留顺序:

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