字典中实现FIFO顺序的Pythonic方法
我想在Python中填充一个字典,但我希望能保持键的顺序,就像列表那样,按照先进先出的方式来处理。
举个例子,
我读取了一个叫做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循环遍历时,最先放进去的就是最先拿出来的。
也就是说,顺序应该是狗,然后是老虎,再然后是熊猫。
有没有简单的方法可以做到这一点,而不需要保持一个外部索引或者使用更复杂的字典结构?抱歉,我可能有点天真……
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')])
还有一个需要注意的地方是,当你创建这个 OrderedDict(或者用 .update
方法更新它)时,必须以保持顺序的方式传递元素。换句话说,你不能用关键字参数来创建它,然后期待顺序会被保留:
>>> OrderedDict(dog='dom',tiger='EN',panda='EN') #doesn't preserve order
OrderedDict([('tiger', 'EN'), ('panda', 'EN'), ('dog', 'dom')])