2016-05-20 41 views
4

我有以下列表:通過不同長度這是一個列表中的列表迭代

a = [[1, [0], [0], [1, [0]]], [1, [0], [0], [1, [0]]], [1, [0], [0]]] 

,我希望把所有的整數,使串了出來:

b = '1001010010100' 

有什麼辦法可以做到這一點? 提前謝謝!

+0

我覺得這裏更普遍的問題是如何遍歷n維列表。非常好的問題... – Oisin

回答

8

這裏是一個叛逆的做法:

a = [[1, [0], [0], [1, [0]]], [1, [0], [0], [1, [0]]], [1, [0], [0]]] 
b = ''.join(c for c in str(a) if c.isdigit()) 
+0

這很聰明。 –

+0

@Yakym Pirozhenko非常感謝你! –

+5

...和智慧+1 ...我不會真的推薦這種方法,但... –

1

碼 -

def solve(x):               
    if isinstance(x, int): 
     return str(x) 
    return ''.join(solve(y) for y in x) 

print(solve(a)) 

輸出 -

1001010010100 
+1

謝謝!你真的幫了我! –

3

您可以編寫遞歸遍歷的嵌套上市,並嘗試將每個元素轉換爲迭代器的功能。

def recurse_iter(it): 
    if isinstance(it, basestring): 
     yield it 
    else: 
     try: 
      for element in iter(it): 
       for subelement in recurse_iter(element): 
        yield subelement 
     except TypeError: 
      yield it 

這個可惡的函數將產生一個對象中的字符串和非可迭代成員的列表。

a = [[1, [0], [0], [1, [0]]], [1, [0], [0], [1, [0]]], [1, [0], [0]]] 
list(recurse_iter(a)) 
# [1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0] 

將此轉換爲字符串足夠簡單。

''.join(map(str, recurse_iter(a))) 
+0

雖然它適用於這種情況,但一般解決方案應該檢查一個元素是否是字符串,以便它不會開始產生單個字符。 –

+0

@BrianSchlenker該案件將導致無限遞歸。我會稍後更新。 –

+0

我喜歡這個答案,因爲它給你選擇[有條件地]修改列表中的所有項目,不管它們有多深。 – Oisin

1

你正在尋找一個flatten功能:

def flatten_str(x): 
    if isinstance(x, list): 
     return "".join(flatten_str(a) for a in x) 
    else: 
     return str(x) 
+0

非常感謝! –