我有一本需要排序的字典。我想根据值对dict进行排序。作为下一步,如果两个键具有相同的值,我想根据键的词典值进行排序。
我试过了。
>>> l
{'a': 5, 'aa': 5, 'c': 1, 'b': 7}
>>> sorted(l)
['a', 'aa', 'b', 'c']
>>> sorted(l.items())
[('a', 5), ('aa', 5), ('b', 7), ('c', 1)]
>>> sorted(l.items(), reverse=True)
[('c', 1), ('b', 7), ('aa', 5), ('a', 5)]
>>> sorted(l.items(), key=l.get, reverse=True)
[('a', 5), ('aa', 5), ('c', 1), ('b', 7)]
>>> l
{'a': 5, 'aa': 5, 'c': 1, 'b': 7}
>>> 5>7
False
>>> sorted(l.items(), key=l.get, reverse=True)
[('a', 5), ('aa', 5), ('c', 1), ('b', 7)]
>>> sorted(l, key=l.get, reverse=True)
['b', 'a', 'aa', 'c']
>>> s=sorted(l, key=l.get, reverse=True)
>>> s
['b', 'a', 'aa', 'c']
>>> s.sort()
>>> s
['a', 'aa', 'b', 'c']
答案 0 :(得分:3)
如果我正确理解了您的问题,那么您正在寻找类似的内容:
d = {'a': 5, 'aa': 5, 'c': 1, 'b': 7}
result = sorted(d.items(), key=lambda x: (x[1], x[0]))
print(result)
输出:
[('c', 1), ('a', 5), ('aa', 5), ('b', 7)]
如果您希望值为升序而第二种排序为降序,则可以执行以下操作:
d = {'a': 5, 'aa': 5, 'c': 1, 'b': 7}
result = sorted(d.items(), reverse=True, key=lambda x: (-x[1], x[0]))
print(result)
输出:
[('c', 1), ('aa', 5), ('a', 5), ('b', 7)]
有关排序的详细信息,请参阅Sorting Howtos.
如果你有一个只包含字符串的元组列表,你可以这样做:
l = [('foo', 'bar'), ('foo', 'spam'), ('baz', 'egg')]
result = sorted(l, key=lambda x: (x[0], [-ord(c) for c in x[1]]))
print(result)
输出:
[('baz', 'egg'), ('foo', 'spam'), ('foo', 'bar')]
答案 1 :(得分:1)
按顺序返回值和键:
sorted(l, key=lambda k: (l[k], k))
仅用于按键,或
sorted(l.items(), key=lambda i: i[::-1])
用于键值对; [::-1]
负步骤切片会反转值和排序键。
首先对值进行排序,然后在值相等时使用键。
结果:
>>> l = {'a': 5, 'aa': 5, 'c': 1, 'b': 7}
>>> sorted(l, key=lambda k: (l[k], k))
['c', 'a', 'aa', 'b']
>>> sorted(l.items(), key=lambda i: i[::-1])
[('c', 1), ('a', 5), ('aa', 5), ('b', 7)]
对于混合方向排序,否定值,并反转排序:
>>> sorted(d.items(), key=lambda i: (-i[1], i[0]), reverse=True)
[('c', 1), ('aa', 5), ('a', 5), ('b', 7)]
否定数字会导致它们按降序排序,而键保持升序;然后换向然后分别上升和下降。