我需要首先对字典进行排序,使用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)]
如您所见,当值相等时,我只能按照指定的递减方式对键进行排序……但是我怎样才能让它们以一种递增的方式排序呢?
发布于 2013-01-23 03:08:55
以下内容适用于您的输入:
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的排序是稳定的。
发布于 2013-01-23 03:09:20
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)]
发布于 2013-01-23 03:14:45
您可以使用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']}
即以1,2,3...
作为关键字并将相应的字母表存储在列表中作为值的新的dict
。
现在您可以使用itertools.chain()
和itertools.product()
遍历sorted(d.items)
并获得所需的结果。
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)]
https://stackoverflow.com/questions/14466068
复制相似问题