我需要先对词典进行排序,使用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)]
正如您所看到的,当值相等时,我只能按指定的方式对键进行排序......但是如何让它们以越来越多的方式排序?
答案 0 :(得分:38)
以下内容适用于您的输入:
d = [('B', 3), ('A', 2), ('A', 1), ('I', 1), ('J', 1)]
sorted(d,key=lambda x:(-x[1],x[0]))
由于您的“值”是数字,因此您可以通过更改符号轻松撤消排序顺序。
换句话说,这种排序按值排序(-x[1]
)(负号首先放大数字),然后对于相同的数字,它按照键({{1}排序})。
如果您的价值不能轻易被“否定”以放置大项目,那么一个简单的解决办法就是排序两次:
x[0]
这是有效的,因为python的排序是稳定的。
答案 1 :(得分:3)
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)]
答案 2 :(得分:1)
您可以使用collections.defaultdict
:
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
1,2,3...
作为键,相应的字母表作为值存储在列表中。
现在,您可以使用sorted(d.items)
和itertools.chain()
遍历itertools.product()
并获得所需的结果。
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)]