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

杰德西尔维奥

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

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

如果这只是字典列表,则:

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

会工作。我不知道如何遍历列表,计算总和,然后排序,该如何做。那就是我现在正在做的,但是我试图通过删除循环来提高代码的效率,因为我的列表中有100亿个列表。

您的想法已经非常好,在排序和使用时使用自定义键功能summapitemgetterplay键上使用:

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确实可以确保:

列表中与每个项目相对应的键仅计算一次,然后用于整个排序过程。

因此,您将有一个非常有效的解决此排序问题的方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

对字典/列表列表中的多个参数进行排序

对列表中的列表列表进行排序

根据特定列对Python中的列表列表进行排序

在列表中对Python字典对象进行排序

在Python 3中对字典列表进行排序

在Python列表中对嵌套字典进行排序?

Python对列表列表进行排序

在列表列表中对值进行排序

在字典中对列表进行排序

在列表列表中对列表元素进行重新排序

Python在排序后对列表列表进行重新排序

Python字典列表列表

如何在Python中的字典中对列表进行排序?

将列表列表中字符串的出现与python中的字典进行比较

Python优化:在字典或列表列表之间进行选择

如何根据 Python 中的日期时间对字典列表进行排序

在具有字典的python中对嵌套列表进行排序

根据字典中的“依赖项”对python列表进行排序

在Python 3.4中按日期对字典列表进行排序

通过在python中对字典进行排序来提取键列表

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

Python:如何对嵌套字典中的特定列表进行排序?

使用 .sort() 函数中的键对 Python 中的列表列表进行排序

如何在Java中对列表列表进行排序?

如何在R中对列表列表进行排序?

如何在 C# 中对列表列表进行排序?

用不同的数据类型对Python中的列表列表进行排序

在Python中按长度和值对列表列表进行排序

展平,删除重复项并在python中对列表列表进行排序