2008-11-11 84 views
13

tôi có đầu vào bao gồm một danh sách liệt kê lồng nhau như thế này:Python - sắp xếp một danh sách liệt kê lồng nhau

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

Tôi muốn sắp xếp danh sách này dựa trên tổng của tất cả các số trong danh sách lồng nhau. .. do đó, các giá trị tôi muốn sắp xếp theo l sẽ trông giống như sau:

[39, 6, 13, 50] 

Sau đó, tôi muốn sắp xếp dựa trên các giá trị này. Vì vậy, đầu ra phải là:

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

Cách hay để làm điều này là gì?

Trả lời

16

Một đơn giản hóa nhẹ và tổng quát đến các câu trả lời cung cấp cho đến nay, sử dụng một phần vừa thêm vào Cú pháp của 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) 

đâu sum_nested() là:

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

Một hàm đệ quy chút sẽ làm điều đó:

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

Tôi muốn nói rằng 'hasattr' là một giải pháp tổng quát hơn trong trường hợp này là' isinstance'. – jfs

Các vấn đề liên quan