假设我有以下 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 函数是根据用户配置动态生成的。
想法?
最佳答案
如果您设置 list.sort
的 reverse
参数,您当前的解决方案将工作正常为 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'}]
>>>
关于Python3 升序降序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27830184/