字典中FIFO顺序的pythonic方式

Dna*_*iel 2 python dictionary

我试图在python中填充一个字典,但我想保留密钥的顺序,因为它们进入 - 正如列表中的FIFO一样.

例如,

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

animal\tconservation_status\n
dog\tdomesticated\n
tiger\tEN\n
panda\tEN\n
Run Code Online (Sandbox Code Playgroud)

也就是说,

animals = {'dog':'dom','tiger':'EN', 'panda':'EN'}
>>> for el in animals:
...     print el
... 
tiger
dog
panda
Run Code Online (Sandbox Code Playgroud)

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

当我将它读入字典时,订单将不会被保留.我希望保留顺序,这样当我进行for循环时,FIRST IN是FIRST OUT.

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

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

mgi*_*son 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}
Run Code Online (Sandbox Code Playgroud)

请注意,OrderedDict保留订单而常规dict则不保留.


>>> OrderedDict([('dog','dom'),('tiger','EN'), ('panda','EN')])
OrderedDict([('dog', 'dom'), ('tiger', 'EN'), ('panda', 'EN')])
Run Code Online (Sandbox Code Playgroud)

另一个问题是你需要以.update保留顺序的方式将项传递给构造函数(或).换句话说,您不能将关键字args传递给构造函数并期望保留顺序:

>>> OrderedDict(dog='dom',tiger='EN',panda='EN')  #doesn't preserve order
OrderedDict([('tiger', 'EN'), ('panda', 'EN'), ('dog', 'dom')])
Run Code Online (Sandbox Code Playgroud)