Python - 对嵌套列表列表进行排序

Python - sort a list of nested lists

提问人:Claudiu 提问时间:11/11/2008 更新时间:4/8/2012 访问量:8215

问:

我的输入由如下所示的嵌套列表组成:

l = [[[[[39]]]], [1, 2, 3], [4, [5, 3], 1], [[[[8, 9], 10], 11], 12]]

我想根据嵌套列表中所有数字的总和对这个列表进行排序......因此,我想按 l 排序的值如下所示:

[39, 6, 13, 50]

然后我想根据这些进行排序。所以输出应该是:

[[1, 2, 3], [4, [5, 3], 1], [[[[39]]]], [[[[8, 9], 10], 11], 12]]

有什么很好的pythonic方法可以做到这一点?

Python 列表 排序 嵌套列表

评论

0赞 Karl Knechtel 9/14/2022
将问题分解为多个步骤。您知道如何“基于”该结果进行排序吗?您知道如何获得给定元素的结果吗?

答:

5赞 jfs 11/11/2008 #1
l.sort(key=sum_nested)

在哪里:sum_nested()

def sum_nested(astruct):
    try: return sum(map(sum_nested, astruct))
    except TypeError:
        return astruct


assert sum_nested([[([8, 9], 10), 11], 12]) == 50
12赞 Greg Hewgill 11/11/2008 #2

一个小的递归函数就可以了:

def asum(a):
    if isinstance(a, list):
        return sum(asum(x) for x in a)
    else:
        return a

l = [[[[[39]]]], [1, 2, 3], [4, [5, 3], 1], [[[[8, 9], 10], 11], 12]]
l.sort(key=asum)
print l

评论

1赞 jfs 11/12/2008
在这种情况下,我会说这是一个比 .hasattrisinstance
16赞 Alex Coventry 11/11/2008 #3

对到目前为止提供的答案进行了轻微的简化和概括,使用了最近对 python 语法的补充:

>>> l = [[[[[39]]]], [1, 2, 3], [4, [5, 3], 1], [[[[8, 9], 10], 11], 12]]
>>> def asum(t): return sum(map(asum, t)) if hasattr(t, '__iter__') else t
...
>>> sorted(l, key=asum)
[[1, 2, 3], [4, [5, 3], 1], [[[[39]]]], [[[[8, 9], 10], 11], 12]]