2014-12-26 14 views
6

Tôi có danh sách các danh sách được lồng trong nhiều lớp danh sách.python: flatten vào danh sách các danh sách nhưng không còn

đầu vào có thể:

[[[[1,2,3] , [a,b,c]]]] hoặc [[[1,2,3] , [a,b,c]]] hoặc [[[1,2,3]] , [[a,b,c]]]

khi tôi sử dụng flat() nó sẽ chỉ làm phẳng tất cả mọi thứ mà không phải là những gì tôi muốn.

[1,2,3,a,b,c]

Những gì tôi cần thay vào đó là

[[1,2,3] , [a,b,c]]

là đầu ra cuối cùng.

nét phẳng của tôi là dưới

def flat(S): 
    if S == []: 
     return S 
    if isinstance(S[0], list): 
     return flat(S[0]) + flat(S[1:]) 
    return S[:1] + flat(S[1:]) 

Trả lời

7
import collections 
def is_listlike(x): 
    return isinstance(x, collections.Iterable) and not isinstance(x, basestring) 

def flat(S): 
    result = [] 
    for item in S: 
     if is_listlike(item) and len(item) > 0 and not is_listlike(item[0]): 
      result.append(item) 
     else: 
      result.extend(flat(item)) 
    return result 

tests = [ [[[[1,2,3] , ['a','b','c']]]], 
      [[[1,2,3] , ['a','b','c']]], 
      [[[1,2,3]] , [['a','b','c']]] ] 

for S in tests: 
    print(flat(S)) 

mang

[[1, 2, 3], ['a', 'b', 'c']] 
[[1, 2, 3], ['a', 'b', 'c']] 
[[1, 2, 3], ['a', 'b', 'c']] 
0

phẳng() có thể trở thành

def flat(mylist): 
    return[val for sublist in mylist for val in sublist] 

Sau đó, bạn có thể gọi nó trong một vòng lặp for như thế này

while type(mylist[0][0]) is list: 
    mylist = flat(my list) 

và nó sẽ làm giảm nó để đầu ra mong muốn của bạn không phụ thuộc vào số lượng danh sách lồng nhau

[[1, 2, 3], ['a', 'b', 'c']] 
2

Thay thế:

if S == []: 
    return S 

với:

if (not any([isinstance(x,list) for x in S])) : 
    return [] if S==[] else [S] 

dường như làm lừa.

Hoặc:

if S == []: 
    return S 
if (not any([isinstance(x,list) for x in S])) : 
    return [S] 

tôi thấy hai yêu cầu - phát hiện khi S không nên làm phẳng, và sau đó trả về một giá trị đó sẽ không được san bằng khi tham gia với phần còn lại (tức là tham gia với append hơn extend). Tôi đoán là một danh sách các phần tử không phải danh sách sẽ không được làm phẳng.

Tôi đang barking lên cùng một cây như unutbu, nhưng trong một cách bối rối hơn. :)

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