Python3 asc desc排序

时间:2015-01-07 22:57:47

标签: python list sorting python-3.x

让我们假设我有一个以下的python列表(这只是一个例子):

my_list = [{'user': 'Joe', 'score': 14},
           {'user': 'Foo', 'score': 12},
           {'user': 'May', 'score': 12},
           {'user': 'Kat', 'score': 12},
           {'user': 'Doe', 'score': 13}]

我需要按用户的分数和降序按升序对此列表进行排序。 预期的排序结果:

my_list = [{'user': 'May', 'score': 12},
           {'user': 'Kat', 'score': 12},
           {'user': 'Foo', 'score': 12},
           {'user': 'Doe', 'score': 13},
           {'user': 'Joe', 'score': 14}]

所以,如果我希望一切按升序排列,我可以做这样的事情:

my_list.sort(key=lambda x: (x['score'], x['user']))

对于整数,只需在其前面添加-即可轻松解决此问题:

my_list.sort(key=lambda x: (-x['score'], x['user']))

不幸的是,字符串不能是否定的: - |

我需要一个不涉及'reverse = True'的通用解决方案。 Lambda函数是基于用户配置动态生成的。

思想?

3 个答案:

答案 0 :(得分:1)

如果您将list.sortreverse参数设置为True,那么您当前的解决方案可以正常工作:

>>> my_list = [{'user': 'Joe', 'score': 14},
...            {'user': 'Foo', 'score': 12},
...            {'user': 'May', 'score': 12},
...            {'user': 'Kat', 'score': 12},
...            {'user': 'Doe', 'score': 13}]
>>> my_list.sort(key=lambda x: (-x['score'], x['user']), reverse=True)
>>> pprint(my_list) # pprint makes the nice output
[{'score': 12, 'user': 'May'},
 {'score': 12, 'user': 'Kat'},
 {'score': 12, 'user': 'Foo'},
 {'score': 13, 'user': 'Doe'},
 {'score': 14, 'user': 'Joe'}]
>>>

这将按相反的顺序对列表进行排序。


修改

由于名称和分数有两种不同的排序顺序,因此您需要使用两种不同的排序来实现所需的输出:

>>> my_list = [{'user': 'Joe', 'score': 14},
...            {'user': 'Foo', 'score': 12},
...            {'user': 'May', 'score': 12},
...            {'user': 'Kat', 'score': 12},
...            {'user': 'Doe', 'score': 13}]
>>> my_list.sort(key=lambda x: x['user'], reverse=True)
>>> my_list.sort(key=lambda x: x['score'])
>>> pprint(my_list)
[{'score': 12, 'user': 'May'},
 {'score': 12, 'user': 'Kat'},
 {'score': 12, 'user': 'Foo'},
 {'score': 13, 'user': 'Doe'},
 {'score': 14, 'user': 'Joe'}]
>>>

答案 1 :(得分:1)

字符串的ord可以是负数:

my_list.sort(key=lambda x: (x["score"],[-ord(x) for x in x["user"]])))


In [50]:  my_list.sort(key=lambda x: (x["score"],[-ord(x) for x in x["user"]]))

In [51]: my_list
Out[51]: 
[{'score': 12, 'user': 'May'},
 {'score': 12, 'user': 'Kat'},
 {'score': 12, 'user': 'Foo'},
 {'score': 13, 'user': 'Doe'},
 {'score': 14, 'user': 'Joe'}]

答案 2 :(得分:0)

您需要为降序添加reverse=True关键字。

>>> my_list.sort(key=lambda x: (-x['score'], x['user']),reverse=True)
>>> my_list
[{'score': 12, 'user': 'May'}, {'score': 12, 'user': 'Kat'}, {'score': 12, 'user': 'Foo'}, {'score': 13, 'user': 'Doe'}, {'score': 14, 'user': 'Joe'}]