2014-12-26 19 views
6

Birden çok liste katmanında iç içe geçmiş listelerin bir listesini görüyorum.python: listelerin bir listesini düzleştirin, ancak daha fazla

olası girişler:

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

Ben sadece ben istemiyorum budur şeyi dümdüz edecek flat() kullanmak [[[1,2,3]] , [[a,b,c]]]. Bunun yerine gerekenler

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

nihai çıktı olarak

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

olduğunu.

Dairem tanım

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:]) 

cevap

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)) 

altındaysa böyle bir for döngüsü içinde diyebiliriz

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

düz() Sonra

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

haline gelebilir verir

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

ve değiştirilmesi iç içe listeleri

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

sayısına bakılmaksızın istediğiniz çıkışa bunu azaltacaktır:

if S == []: 
    return S 

ile:

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

yapmak gibi görünüyor Numara.

Veya:

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

İki gereksinimleri görmek - (kalanı ile katıldığında dümdüz olmayacak bir değer dönen ardından S düzleştirilmiş edilmemelidir durumunun saptanması, ve yani append ziyade ile katılmak extend). Tahminimce liste dışı unsurların listesi düzleştirilmemelidir.

unutbu ile aynı ağacın havlamasını yapıyorum ama daha karışık bir şekilde. :)

İlgili konular