Python:按值对字典进行排序,同时按字母顺序维护以防止出现关系

Kla*_*aas 1 python sorting dictionary

因此,如果项目值相同,我想按值对字典进行排序并按字母顺序维护以防止出现联系。但是,python字典没有按字母顺序保存数据,如何解决?先感谢您!

这是我的代码:

from collections import Counter
test = "betty bought a bit of butter but the butter was bitter"
Counter(test.split()).most_common(3)
Run Code Online (Sandbox Code Playgroud)

输出:

[('butter', 2), ('a', 1), ('bitter', 1)]
Run Code Online (Sandbox Code Playgroud)

所需的输出应该是:

[('butter', 2), ('a', 1), ('betty', 1)]
Run Code Online (Sandbox Code Playgroud)

因为“苦味”应该按字母顺序排在“贝蒂”之后。

Mar*_*ers 5

使用带有自定义键的heapq.nsmallest()函数,传入负数以反转该部分的排序,并按字母顺序返回键本身:

import heapq

top3 = heapq.nsmallest(
    3, Counter(test.split()).items(),
    key=lambda kv: (-kv[1], kv[0]))
Run Code Online (Sandbox Code Playgroud)

Counter.most_common()方法heapq.nlargest()在您给它一个小于字典中键数的参数时使用,并且只使用计数来确定顺序,因此在平局的情况下,顺序是任意的。以上是您特定排序顺序的等效项。就像Counter.most_common(),这是一个 O(NlogK) 解决方案(N 是计数的项目数,K 是您想要输出的项目数)。

演示:

>>> import heapq
>>> from collections import Counter
>>> test = "betty bought a bit of butter but the butter was bitter"
>>> heapq.nsmallest(3, Counter(test.split()).items(), key=lambda kv: (-kv[1], kv[0]))
[('butter', 2), ('a', 1), ('betty', 1)]
Run Code Online (Sandbox Code Playgroud)