将“value”作为主键,“key”作为辅助键对python字典进行排序

2024-09-30 23:40:38 发布

您现在位置:Python中文网/ 问答频道 /正文

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

因此,给定一个字符串“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”都出现在文本中正好两次,而且顺序不对。什么是最好的方法(希望也是最短的)来做到这一点?在


Tags: key字符串fromimport顺序字母counterkeys
3条回答

如果已经在使用Counter对象,则计数器。最常见方法。这将按频率从高到低的顺序返回项目列表。在

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

这可以在一次分拣过程中完成。诀窍是做一个升序排序,将被否定的计数作为主排序键,字典的键串作为第二个排序键。在

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

输出

^{pr2}$

最短的方法是:

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

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

注意,如果字典很大,因为它执行两个完整的排序,那么它的运行时间不会最快,但实际上它可能是最简单的,因为您希望值降序,键升序。在

它起作用的原因是Python保证排序是稳定的。这意味着,当键相等时,原始顺序将保持不变,因此,如果您从最后一个键到第一个键重复排序,您将获得所需的结果。另外,reverse=True不同于仅仅反转输出,因为它也尊重稳定性,并且只在键不同的地方反转结果。在

相关问题 更多 >