Python 在这种情况下,排序()的替代方法是什么?或者这可以管理吗?
考虑到下面的字典Python 在这种情况下,排序()的替代方法是什么?或者这可以管理吗?,python,sorting,dictionary,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的值。如果有帮助的话,
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的值。如果有帮助的话,字典的值也总是正值。试试看
key=lambda x:(-d[x], x)
为负值编辑尝试
key=lambda x:(-d[x], x)
为负值编辑如何:
>>> 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(sorted(d), key=d.get, reverse=True)
['b', 'aa', 'ab', 'c', 'a']
那么:
>>> 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(sorted(d), key=d.get, reverse=True)
['b', 'aa', 'ab', 'c', 'a']
输出
['b', 'aa']
因为我们将元组作为键返回,所以比较将像前面提到的那样进行
输出
['b', 'aa']
由于我们将元组作为键返回,因此如果您不介意重塑数据,比较将像前面提到的那样进行:
>>> 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']
如果您不介意重塑数据:
>>> 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']
如果您不需要在计数相等时按键排序,那么
计数器是解决此问题的正确数据结构
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))
如果您不需要在计数相等时按键排序,那么计数器是解决此问题的正确数据结构
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))
数字会一直是正数吗?是的,我会把它添加到原始帖子中。我实际上从你给出的代码中得到了预期的输出。数字会一直是正数吗?是的,我会把它添加到原始帖子中。我实际上从你给出的代码中得到了预期的输出。不会起作用。OP希望在d[x]
上反向排序,而x
上的非反向排序将不起作用。OP希望在d[x]
上进行反向排序,在x
@mhlester上进行非反向排序。如果您是正确的,这也适用于负片:)@mhlester您是正确的,这也适用于负片:)