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

时间:2013-06-30 23:10:28

标签: 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']

2 个答案:

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

否定数字会导致它们按降序排序,而键保持升序;然后换向然后分别上升和下降。