将python词典排序为'value'作为主键,'key'作为secondary键

时间:2016-03-18 16:32:57

标签: python python-3.x dictionary

我在这里要做的是根据字符串中出现的次数按降序显示字符。如果两个字符共享相同的出现次数,则应按字母顺序显示它们。

所以给定一个字符串'abaddbccdd',我想要显示为输出的是: ['d','a','b','c']

这是我到目前为止所做的:

>>> from collections import Counter
>>> s = 'abaddbccdd'
>>> b = Counter(s)
>>> b
Counter({'d': 4, 'a': 2, 'c': 2, 'b': 2})
>>> b.keys()
['a', 'c', 'b', 'd']
>>> c = sorted(b, key=b.get, reverse=True)
>>> c
['d', 'a', 'c', 'b']
>>>

但如何处理第二部分? 'a','b'和'c'都会在文本中出现两次并且无序。这样做的最佳方式(希望最短)是什么?

4 个答案:

答案 0 :(得分:2)

最短的方式是:

>>> sorted(sorted(b), key=b.get, reverse=True)
['d', 'a', 'b', 'c']

因此,按照自然顺序(键顺序)对序列进行一次排序,然后对值进行反向排序。

请注意,如果字典很大,这将没有最快的运行时间,因为它执行两个完整的排序,但实际上它可能是最简单的,因为你希望值降序和键升序。

它的工作原理是Python保证排序稳定。这意味着当键相等时保留原始顺序,因此如果您从最后一个键重复排序回到第一个键,您将获得所需的结果。同样reverse=True不仅仅是反转输出,因为它也尊重稳定性,只反转键不同的结果。

答案 1 :(得分:2)

这可以在单个排序过程中完成。诀窍是进行升序排序,将计数数字否定为主要排序键,将字典的键字符串作为次要排序键。

b = {'d': 4, 'a': 2, 'c': 2, 'b': 2}
c = sorted(b, key=lambda k:(-b[k], k))
print(c)

<强>输出

['d', 'a', 'b', 'c']

答案 2 :(得分:1)

如果您已经在使用Counter对象,则有Counter.most_common方法。这将按照从最高到最低频率的顺序返回项目列表。

>>> b.most_common()
[('d', 4), ('a', 2), ('b', 2), ('c', 2)]

答案 3 :(得分:0)

您可以使用p功能:

lambda