gpt4 book ai didi

python - 在python中对字典列表的列表进行排序

转载 作者:太空狗 更新时间:2023-10-30 01:13:21 26 4
gpt4 key购买 nike

我有一个对象,它是字典列表的列表:

myObject =[[{ "play": 5.00, "id": 1, "uid": "abc" },  \
{ "play": 1.00, "id": 2, "uid": "def" }], \
[{ "play": 6.00, "id": 3, "uid": "ghi" }, \
{ "play": 7.00, "id": 4, "uid": "jkl" }], \
[{ "play": 3.00, "id": 5, "uid": "mno" }, \
{ "play": 1.00, "id": 6, "uid": "pqr" }]]

我想根据每个嵌套列表的字典中 play 值的总和对列表进行排序。然后对象将像这样排序:

myObject =[[{ "play": 6.00, "id": 3, "uid": "ghi" },  \
{ "play": 7.00, "id": 4, "uid": "jkl" }], \
[{ "play": 5.00, "id": 1, "uid": "abc" }, \
{ "play": 1.00, "id": 2, "uid": "def" }], \
[{ "play": 3.00, "id": 5, "uid": "mno" }, \
{ "play": 1.00, "id": 6, "uid": "pqr" }]]

如果它只是一个字典列表,那么:

排序(myObject,key=sum(map(itemgetter(play))),reverse=True)

会起作用。如果不遍历列表,计算总和,然后排序,我无法弄清楚如何做到这一点。这就是我现在正在做的事情,但我正在尝试通过删除循环来提高此代码的效率,因为我的列表中有数以百万计的列表。

最佳答案

你的想法已经很不错了,在排序和使用sum的时候使用自定义key函数, map和一个 itemgetterplay 上键:

key=sum(map(itemgetter(play)))

不过你确实有问题:key参数需要一个函数,该函数接受您正在排序的列表中的一个项目。但是sum也不map返回一个函数,因此您不能将其用作键函数。相反,您可以创建一个 lambda 函数来为每个项目执行此组合。

其他问题是play应该是一个字符串 'play'相反,那个 map应该将子列表作为参数。所以你的关键函数看起来像这样:

key=lambda x: sum(map(itemgetter('play'), x))

这是顺便说一句。在功能上等同于以下可能更具可读性的生成器理解:

key=lambda x: sum(y['play'] for y in x)

sorted 一起使用应该可以,但您应该考虑直接使用 list.sort 对列表进行排序相反:

>>> myObject = [[{ "play": 5.00, "id": 1, "uid": "abc" },
{ "play": 1.00, "id": 2, "uid": "def" }],
[{ "play": 6.00, "id": 3, "uid": "ghi" },
{ "play": 7.00, "id": 4, "uid": "jkl" }],
[{ "play": 3.00, "id": 5, "uid": "mno" },
{ "play": 1.00, "id": 6, "uid": "pqr" }]]

>>> myObject.sort(key=lambda x: sum(y['play'] for y in x), reverse=True)

>>> for x in myObject:
print(x)

[{'play': 6.0, 'uid': 'ghi', 'id': 3}, {'play': 7.0, 'uid': 'jkl', 'id': 4}]
[{'play': 5.0, 'uid': 'abc', 'id': 1}, {'play': 1.0, 'uid': 'def', 'id': 2}]
[{'play': 3.0, 'uid': 'mno', 'id': 5}, {'play': 1.0, 'uid': 'pqr', 'id': 6}]

(顺便说一句。myObject 对于事物列表来说是个糟糕的名字。)


就问题的效率或复杂性而言,您确实无法避免最终必须遍历每个子列表。如果不查看值就不可能确定这些值的总和,因此显然您无法避免这种情况。

但是,您应该确保每个总和只计算一次,以避免多次查看子列表中的项目。幸运的是,默认排序使用 list.sort 确实保证:

The key corresponding to each item in the list is calculated once and then used for the entire sorting process.

因此您将有一个非常有效的解决方案来解决这个排序问题。

关于python - 在python中对字典列表的列表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35689347/

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