Python3 中的 dict 是有序的吗?
t = {}
t[‘a’] = ‘A’
t[‘b’] = ‘B’
t[‘c’] = ‘C’
for k, v in t.items():
print(v)
这个代码 j 结果在 py2.7 中是 ACB, 在 py3.6 中是 ABC.
而且我试了好多次 py3.6 的字典输出顺序跟存入顺序一样啊
Python3 中的 dict 是有序的吗?
在 Python 3.7 之前,dict 的插入顺序是 CPython 的实现细节,不能作为语言保证。但从 Python 3.7 开始,字典会保持键值对的插入顺序,这已经成为了 Python 语言的正式规范。
所以,对于 Python 3.7 及以上版本,答案是:是的,dict 是有序的。这里的“有序”特指“插入顺序”,而不是按键排序。
简单验证代码:
# Python 3.7+
d = {}
d['z'] = 1
d['a'] = 2
d['c'] = 3
print(list(d.keys())) # 输出: ['z', 'a', 'c'],顺序与插入一致
print(d) # 输出: {'z': 1, 'a': 2, 'c': 3}
关键点:
- 这个顺序是插入顺序。更新现有键的值不会改变其位置。
- 从 Python 3.6 开始,CPython 实现已经保持了顺序,但直到 3.7 才成为语言标准。
- 如果你需要基于键的排序,应该用
collections.OrderedDict(它现在和普通dict在顺序行为上一致,但提供了一些额外的顺序相关方法,如move_to_end)或者用sorted()。
一句话总结: 从 Python 3.7 起,字典的插入顺序是官方保证的语言特性。
那还要 collections.OrderedDict 有什么用…
https://docs.python.org/3.6/whatsnew/3.6.html#new-dict-implementation
> The order-preserving aspect of this new implementation is considered an implementation detail and should not be relied upon (this may change in the future, but it is desired to have this new dict implementation in the language for a few releases before changing the language spec to mandate order-preserving semantics for all current and future Python implementations; this also helps preserve backwards-compatibility with older versions of the language where random iteration order is still in effect, e.g. Python 3.5).
兼容性考虑
这个“序”如何访问呢?
如何根据序来访问呢?
想要有序,请使用 collections.OrderedDict
t = {}
t[‘b’] = ‘B’
t[‘a’] = ‘A’
t[‘c’] = ‘C’
for k, v in t.items():
print(v)
输出顺序跟存入顺序一样?你再试试
3.6 确保 dict 有序。。。但是你不能把这个当确保的事情
第一个确保 -> 实现
tablib 里面用的好多
一样啊,你自己用 3.6 试试


