python字典按值排序-python - 如何按值对字典进行排序?

从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提出了一些明显的设计目标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值