从Python 3.6开始,内置的dict将被订购
好消息,所以OP的原始用例是从具有唯一字符串ID的数据库中检索到的映射对作为键和数值作为内置Python v3.6 + dict的值,现在应该遵循插入顺序。
如果说从数据库查询得到的两个列表表达式如下:
SELECT a_key,a_value FROM a_table ORDER BY a_value;
将存储在两个Python元组中,k_seq和v_seq(由数字索引对齐,当然长度相同),然后:
k_seq=('foo','bar','baz')v_seq=(0,1,42)ordered_map=dict(zip(k_seq,v_seq))
允许稍后输出为:
fork,vinordered_map.items():print(k,v)
在这种情况下产生(对于新的Python 3.6+内置字典!):
foo0bar1baz42
每个v值相同的排序。
在我的机器上安装Python 3.5的地方,它目前产生:
bar1foo0baz42
细节:
正如Raymond Hettinger在2012年提出的那样(参见python-dev上的邮件主题为“更快速迭代的更紧凑词典”),现在(2016年)由Victor Stinner发送给python-dev,主题为“Python 3.6 dict” 紧凑并获得私有版本;并且关键字变得有序“由于问题27350的修复/实现”紧凑和有序的dict“在Python 3.6中我们现在可以使用内置的dict来维护插入顺序!!
希望这将导致薄层OrderedDict实现作为第一步。 正如@ JimFasarakis-Hilliard所指出的那样,有些人在未来也会看到OrderedDict类型的用例。 我认为整个Python社区将仔细检查,如果这将经得起时间的考验,以及接下来的步骤将是什么。
是时候重新考虑我们的编码习惯,不要错过稳定订购的可能性:
关键字参数和
(中间)dict存储
第一个是因为它在某些情况下简化了函数和方法实现中的调度。
第二,因为它鼓励更容易使用collections.OrderedDicts作为处理管道的中间存储。
Raymond Hettinger在他的旧金山Python Meetup Group演讲2016-DEC-08上提供了解释“Python 3.6 Dictionaries背后的技术”的文档。
也许相当一些Stack Overflow高度装饰的问答页面将收到此信息的变体,许多高质量的答案也需要每个版本更新。
警告Empat(但也见下面更新2017-12-15):
正如@ajcr正确地指出:“这个新实现的顺序保留方面被认为是一个实现细节,不应该依赖它。” (来自whatsnew36)没有采摘,但引用被削减了一点悲观;-)。 它继续作为“(这可能在未来发生变化,但是在更改语言规范之前,希望在几种版本的语言中使用这个新的dict实现,以便为所有当前和未来的Python实现强制保持语义保持语义;这也是 有助于保持与随机迭代顺序仍然有效的语言的旧版本的向后兼容性,例如Python 3.5)。“
因此,在某些人类语言(例如德语)中,用法形成语言,现在已经在whatsnew36中声明了...
更新2017-12-15:
在发往python-dev列表的邮件中,Guido van Rossum宣称:
这样做。 “Dict保持插入秩序”是裁决。 谢谢!
因此,dict插入排序的版本3.6 CPython副作用现在正成为语言规范的一部分(而不再仅仅是实现细节)。 Raymond Hettinger在讨论中提醒,该邮件线程还为collections.OrderedDict提出了一些明显的设计目标。