基于第一列然后下一列进行排序

5 python sorting python-2.7

我有一本需要排序的字典.我想根据值对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']
Run Code Online (Sandbox Code Playgroud)

Sam*_*uns 5

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

d = {'a': 5, 'aa': 5, 'c': 1, 'b': 7}
result = sorted(d.items(), key=lambda x: (x[1], x[0]))
print(result)
Run Code Online (Sandbox Code Playgroud)

输出:

[('c', 1), ('a', 5), ('aa', 5), ('b', 7)]
Run Code Online (Sandbox Code Playgroud)

如果您希望值按升序排列,而第二个排序按降序排列,您可以这样做:

d = {'a': 5, 'aa': 5, 'c': 1, 'b': 7}
result = sorted(d.items(), reverse=True, key=lambda x: (-x[1], x[0]))
print(result)
Run Code Online (Sandbox Code Playgroud)

输出:

[('c', 1), ('aa', 5), ('a', 5), ('b', 7)]
Run Code Online (Sandbox Code Playgroud)

有关排序的更多信息,请参阅排序指南。


如果您有一个仅包含字符串的元组列表,您可以执行类似的操作:

l = [('foo', 'bar'), ('foo', 'spam'), ('baz', 'egg')]

result = sorted(l, key=lambda x: (x[0], [-ord(c) for c in x[1]]))
print(result)
Run Code Online (Sandbox Code Playgroud)

输出:

[('baz', 'egg'), ('foo', 'spam'), ('foo', 'bar')]
Run Code Online (Sandbox Code Playgroud)

  • 附带说明一下,lambda 函数可以用等效的、更高效、稍微不太明显的函数“operator.itemgetter(1, 0)”代替。 (2认同)