在这种情况下,sorted()的替代方法是什么?或者这可以管理吗?

时间:2014-01-15 03:57:22

标签: python sorting dictionary

考虑以下词典......

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.如果有帮助,字典的值也将始终为正。

6 个答案:

答案 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))