gpt4 book ai didi

Python 通过多个键使用 lambda 排序列表或字典

转载 作者:太空宇宙 更新时间:2023-11-04 08:41:02 25 4
gpt4 key购买 nike

这是我的字典列表:

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}]

有人知道怎么解决吗?

最佳答案

你快到了;你的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}]

关于Python 通过多个键使用 lambda 排序列表或字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44812982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com