3

我正在尝试在 python 中填充字典,但我想在键进入时保留它们的顺序 - 就像列表一样,FIFO 可以做到这一点。

例如,

我阅读了一个名为 animals.txt 的文件,其中包含以下信息:

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

IE,

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

在FIFO中应该有狗,老虎,熊猫出来......

当我将其读入字典时,将不会保留该顺序。我希望保留订单,这样当我执行 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保持顺序的方式将项目传递给构造函数(或)。换句话说,您不能将关键字 args 传递给构造函数并期望保留顺序:

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