让我们假设我有一个以下的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函数是基于用户配置动态生成的。
思想?
答案 0 :(得分:1)
如果您将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'}]
>>>
答案 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'}]