我试图在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.
即,狗,然后是老虎,然后是熊猫.
有没有一个很好的方法来做到这一点,而不必保留外部索引或更复杂的字典结构?不确定,对不起我的天真......
是.您使用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)