5

我有一本需要排序的字典。我想根据值对字典进行排序。作为下一步,如果两个键具有相同的值,我想根据键的字典值进行排序。

我试过这个。

>>> 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']
4

2 回答 2

4

如果我正确理解了您的问题,那么您正在寻找类似的东西:

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)]

有关排序的更多信息,请参阅排序方法。


如果你有一个只包含字符串的元组列表,你可以这样做:

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')]
于 2013-06-30T23:13:21.617 回答
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)]

对数字取反会使它们按降序排序,而键保持升序;反转然后将其分别交换为升序和降序。

于 2013-06-30T23:13:00.127 回答