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 按第二个值,reverse=True,然后按键,reverse=False对元组列表进行排序_Python_Sorting_Dictionary_Reverse - Fatal编程技术网

Python 按第二个值,reverse=True,然后按键,reverse=False对元组列表进行排序

Python 按第二个值,reverse=True,然后按键,reverse=False对元组列表进行排序,python,sorting,dictionary,reverse,Python,Sorting,Dictionary,Reverse,我需要首先按reverse=True的值对字典进行排序,对于重复的值,按键排序,reverse=False 到目前为止,我有这个 dict = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)] sorted(dict.items(), key=lambda x: (x[1],x[1]), reverse=True) 它返回 [('B', 3), ('A', 2), ('J', 1), ('I', 1), ('A', 1)] 但我需要的是:

我需要首先按
reverse=True的值对字典进行排序,对于重复的值,按键排序,
reverse=False

到目前为止,我有这个

dict = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
sorted(dict.items(), key=lambda x: (x[1],x[1]), reverse=True)
它返回

[('B', 3), ('A', 2), ('J', 1), ('I', 1), ('A', 1)]
但我需要的是:

[('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]

如您所见,当值相等时,我只能按指定的递减方式对键进行排序。。。但是我怎样才能让它们以一种越来越流行的方式进行排序呢

以下内容适用于您的输入:

d = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
sorted(d,key=lambda x:(-x[1],x[0]))
由于“值”是数字,因此可以通过更改符号轻松反转排序顺序

换句话说,这种排序按值(
-x[1]
)排序(负号先放大数字),然后对相同的数字按键排序(
x[0]

如果你的价值不能如此容易地被“否定”而将大项目放在第一位,那么一个简单的解决方法是排序两次:

from operator import itemgetter
d.sort(key=itemgetter(0))
d.sort(key=itemgetter(1),reverse=True)

这是因为python的排序是稳定的。

您可以使用
集合。defaultdict

In [4]: l = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]

In [5]: sorted(l, key=lambda (x,y):(-y,x))
Out[5]: [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
In [48]: from collections import defaultdict

In [49]: dic=[('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]

In [50]: d=defaultdict(list)

In [51]: for x,y in dic:
    d[y].append(x)
    d[y].sort()          #sort the list
现在
d
类似于:

 defaultdict(<type 'list'>, {1: ['A', 'I', 'J'], 2: ['A'], 3: ['B']}

dict
是一个列表——甚至不是一个真正适合变成字典的列表,因为它会有重复的键……多亏了mgilson,它才起作用。我也尝试过类似的东西,但困了,不能直接思考。谢谢我不太确定你在这里展示什么。。。您可能应该提供更多的解释:对于上面的示例,如果您使用itemgetter方法,优先级顺序相反:
d.sort(…)
itemgetter部分错误,@Lorenz点有效
In [65]: l=[ product(y,[x]) for x,y in sorted(d.items(),reverse=True)]

In [66]: list(chain(*l))
Out[66]: [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]