python字典赋值不按顺序

Rat*_*Don 1 python dictionary

我想使用带有键的字典以及带索引的列表.但我发现字典的分配不符合规定.

我的python脚本是:

left=['E','Z','T','Y','F']

for lhs in left:
  first[lhs]=set()
  follow[lhs]=set()
  print first
Run Code Online (Sandbox Code Playgroud)

我得到的输出为:

{'E': set([])}
{'Z': set([]), 'E': set([])}
{'Z': set([]), 'E': set([]), 'T': set([])}
{'Y': set([]), 'Z': set([]), 'E': set([]), 'T': set([])}
{'Y': set([]), 'Z': set([]), 'E': set([]), 'T': set([]), 'F': set([])}
Run Code Online (Sandbox Code Playgroud)

有一次它被插入到最后,另一次被插入到开头.这让我觉得我根本不懂字典.我在哪里可以深入了解字典.以及如何使用键和索引遍历字典.对于我现在正在使用:

for lhs in left:
  print first[lhs]
Run Code Online (Sandbox Code Playgroud)

这有些如何帮助索引.但还有其他方法吗?

che*_*ner 6

使用collections.OrderedDict.它需要Python 2.7,但它会记住添加键的顺序,而不是基于底层哈希算法以任意顺序存储它们.

更新:确切地说,dict的存储不变,但迭代是通过附加数据结构实现的,以根据键的原始插入顺序提供固定顺序.

  • 它仍然以任意顺序存储它们,Ordered dict只是一个dict + list.当插入一个项目时,你将键添加到列表以及将它存储在dict.So列表中保留键的顺序.当迭代命令dict时,它通过列表元素完成. (2认同)
  • @SrinivasReddyThatiparthy:但是`OrderedDict`类透明地处理所有这些."记住订单"和"按顺序存储"之间没有*实际*区别.并且只要保留API,任何时候底层实现都可以自由更改. (2认同)
  • 严格来说,OrderedDict只是一个dict,其迭代是使用非用户可访问的补充数据结构实现的.(这是Python,用户*可以*访问它,但不应该.) (2认同)