考虑以下词典......
d = {'ab': 3, 'aa': 3, 'b': 4, 'c': 2, 'a': 1}
>>>sorted(d, key=d.get, reverse=True)[:2]
['b', 'ab']
使用sorted,目标是生成与两个最高值相关联的键。这是我无法让它做我想做的事情:当两个值相关时,应该选择按字母顺序排列的键。因此,在这种情况下,我实际想要返回的是['b','aa'],因为'aa'和'ab'都具有值3.如果有帮助,字典的值也将始终为正。
答案 0 :(得分:3)
怎么样:
>>> d = {'ab': 3, 'aa': 3, 'b': 4, 'c': 2, 'a': 1}
>>> sorted(d, key=lambda x: (-d[x], x))
['b', 'aa', 'ab', 'c', 'a']
>>> sorted(d, key=lambda x: (-d[x], x))[:2]
['b', 'aa']
或
>>> sorted(d, key=lambda x: (-d[x], x.lower()))[:2]
['b', 'aa']
取决于你对案件的关注程度。
您还可以利用排序稳定的事实并分两次进行:
>>> sorted(sorted(d), key=d.get, reverse=True)
['b', 'aa', 'ab', 'c', 'a']
答案 1 :(得分:1)
d = {'ab': 3, 'aa': 3, 'b': 4, 'c': 2, 'a': 1}
print sorted(d, key = lambda x: (-d[x], x))[:2]
<强>输出强>
['b', 'aa']
由于我们将元组作为键返回,因此将会像提到here
那样进行比较答案 2 :(得分:0)
尝试
key=lambda x:(-d[x], x)
编辑为负值
答案 3 :(得分:0)
sorted(d, key=lambda dx: (-d[dx], d))[:2]
答案 4 :(得分:0)
如果您不介意重塑数据:
>>> import itertools
>>> d = {'ab': 3, 'aa': 3, 'b': 4, 'c': 2, 'a': 1}
>>> sorted(d, key=lambda k:(d[k], k), reverse=True)
['b', 'ab', 'aa', 'c', 'a']
>>> cols = {}
>>> for k,v in d.items():
... if v not in cols:
... cols[v] = []
... cols[v].append(k)
...
>>> cols
{1: ['a'], 2: ['c'], 3: ['ab', 'aa'], 4: ['b']}
>>> list(itertools.chain.from_iterable([cols[k] for k in sorted(cols, reverse=True)]))
['b', 'ab', 'aa', 'c', 'a']
>>> list(itertools.chain.from_iterable([cols[k] for k in sorted(cols, reverse=True)]))[:2]
['b', 'ab']
答案 5 :(得分:0)
如果你没有要求按键排序,那么Counter
是解决这个问题的正确数据结构。
from collections import Counter
d = {'ab': 3, 'aa': 3, 'b': 4, 'c': 2, 'a': 1}
cnt = Counter(d)
d.most_common(2)
添加按键排序的要求意味着:
sorted(d.most_common(2), key=lambda k,v: (v,k))