作者:莹TX_937 | 来源:互联网 | 2023-01-30 22:21
这是我的字典列表:
l = [{'a': 2, 'c': 1, 'b': 3},
{'a': 2, 'c': 3, 'b': 1},
{'a': 1, 'c': 2, 'b': 3},
{'a': 1, 'c': 3, 'b': 2},
{'a': 2, 'c': 5, 'b': 3}]
现在,我想按用户提供的键和顺序对列表进行排序。例如:
keys = ['a', 'c', 'b']
orders = [1, -1, 1]
我试图在sort()
方法中使用lambda,但是它以一种奇怪的方式失败了:
>>> l.sort(key=lambda x: (order * x[key] for (key, order) in zip(keys, orders)))
>>> l
[{'a': 2, 'c': 5, 'b': 3},
{'a': 1, 'c': 3, 'b': 2},
{'a': 1, 'c': 2, 'b': 3},
{'a': 2, 'c': 3, 'b': 1},
{'a': 2, 'c': 1, 'b': 3}]
有人知道如何解决吗?
1> Martijn Piet..:
你快到了;您lambda
产生了生成器表达式,而这些表达式恰好按其内存地址排序(在Python 2中),并TypeError: '<' not supported between instances of 'generator' and 'generator'
在Python 3中产生了异常。
改用列表理解:
l.sort(key=lambda x: [order * x[key] for (key, order) in zip(keys, orders)])
演示:
>>> l = [{'a': 1, 'c': 2, 'b': 3},
... {'a': 1, 'c': 3, 'b': 2},
... {'a': 2, 'c': 1, 'b': 3},
... {'a': 2, 'c': 5, 'b': 3},
... {'a': 2, 'c': 3, 'b': 1}]
>>> keys = ['a', 'c', 'b']
>>> orders = [1, -1, 1]
>>> l.sort(key=lambda x: [order * x[key] for (key, order) in zip(keys, orders)])
>>> from pprint import pprint
>>> pprint(l)
[{'a': 1, 'b': 2, 'c': 3},
{'a': 1, 'b': 3, 'c': 2},
{'a': 2, 'b': 3, 'c': 5},
{'a': 2, 'b': 1, 'c': 3},
{'a': 2, 'b': 3, 'c': 1}]