我在这里要做的是根据字符串中出现的次数按降序显示字符。如果两个字符共享相同的出现次数,则应按字母顺序显示它们。
所以给定一个字符串'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'都会在文本中出现两次并且无序。这样做的最佳方式(希望最短)是什么?
答案 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