2013-09-24 58 views
1

我有一個像[[v],[v]]這樣的Python數組數據結構,v是大小爲2或另一個[[v] ,[v]]數據類型。你可以看到下面的真實數據:遞歸(或非遞歸)迭代通過python數組並獲取元素

ex1: 

list: [[[1, '1.0.1'], [1, '2.0.1']], [1, '3.0.11']] 

ex2: 

list: [[[[1, '1.0.1'], [1, '2.0.1']], [1, '3.0.11']], [1, '4.0.11']] 

現在我的問題是我應該得到的元素從左至右第[1,「1.0.1」]那麼[1,「2.0.1」]等上。並注意數組的大小各不相同。

我該如何做到這一點?

+0

爲什麼你有這樣的數據結構,以及爲什麼你需要遍歷它以這種方式?這是可能的,也不是太困難,但最好的解決方案可能是重新組織數據。 – user2357112

+0

這應該是一個鏈表嗎? – user2357112

+0

因此,您的預期輸出只是一個包含從左到右的所有實際值的平面列表?如果不是,你能解釋你想要的輸出類型嗎? – Marius

回答

2

一個可能的解決辦法是壓平名單:

def flatten(lst): 
    if not lst: 
     return [] 
    elif not isinstance(lst, list): 
     return [lst] 
    else: 
     return flatten(lst[0]) + flatten(lst[1:]) 

這將允許你遍歷順序列表:

ls1 = [[[[1, '1.0.1'], [1, '2.0.1']], [1, '3.0.11']], [1, '4.0.11']] 
flatten(ls1) 
=> [1, '1.0.1', 1, '2.0.1', 1, '3.0.11', 1, '4.0.11'] 

或者,使用發電機:

def flatten(lst): 
    if not lst: 
     return 
    elif not isinstance(lst, list): 
     yield lst 
    else: 
     for e in flatten(lst[0]): 
      yield e 
     for e in flatten(lst[1:]): 
      yield e 

list(flatten(ls1)) 
=> [1, '1.0.1', 1, '2.0.1', 1, '3.0.11', 1, '4.0.11'] 
0

這個答案可能是缺少明顯的東西,所以我提前道歉......

但你的數據結構,似乎是很多比它更復雜需要呢?

v = [(1, '1.0.1'), (1, '2.0.1'), (1, '3.0.11')] 
v.append((1, '4.0.11')) 
print v 

你想要做什麼?

1

下面是一個迭代器來做你想做的事情:

def iterate(xs): 
    try: 
     if isinstance(xs[1],str): 
      yield xs 
      return 
    except IndexError: 
     pass 
    for x in xs: 
     yield from iterate(x) 

用法示例:

>>> list(iterate([[[[1, '1.0.1'], [1, '2.0.1']], [1, '3.0.11']], [1, '4.0.11']])) 
[[1, '1.0.1'], [1, '2.0.1'], [1, '3.0.11'], [1, '4.0.11']]