2008-11-11 76 views
13

我有輸入組成這樣的嵌套列表的列表:Python的 - 排序嵌套列表的列表

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這樣做?

回答

16

略有簡化和泛化到目前爲止提供的答案,使用最近除了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]] 
5
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

小遞歸函數會做到這一點:

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

我會說'hasattr`是比'isinstance`更普遍的解決方案。 – jfs 2008-11-11 20:58:34