Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在这种情况下,排序()的替代方法是什么?或者这可以管理吗?_Python_Sorting_Dictionary - Fatal编程技术网

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您是正确的,这也适用于负片:)