2014-02-09 179 views
1

給定一個嵌套列表L(使得L的每個元素是一個整數或一個列表,它本身可能包含整數或列表,這些列表可能會依次等等)返回確實是在L.Python嵌套列表遞歸搜索

search([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], 8) 

應該返回True。

這是我到目前爲止有:

def search (L,s): 
"""(list, anytype) _> Bool 
Returns true iff s is present in L 
""" 
if L: 
    if L[0] == s: 
     return True 
    else: 
     return search (L[1:], s) 
else: 
    return False 

這個當前的代碼適用於列表如果沒有嵌套,或者如果它是嵌套像這樣(嵌套元素是最後一個元素):

[1, 2, 3, [4, 5]] 

但不適合以下事項:

[1, 2, [3, 4], 5] 

我怎樣才能改變我的代碼,以便它適用於一個內斯特d列表?嵌套元素在列表中的任何位置不是最後一個元素?

感謝任何幫助!

編輯:對不起,忘了指定它需要遞歸。

+0

的可能重複[我怎樣才能深深的搜索Python列表?(HTTP ://stackoverflow.com/questions/15292893/how-can-i-deep-search-a-python-list) – Nabla

回答

5

可以擠這樣

def search(current_item, number): 
    if current_item == number: return True 
    return isinstance(current_item, list) \ 
     and any(search(item, number) for item in current_item) 

整個代碼,您可以測試它像這樣

for i in range(12): 
    print i, search([1, [2, 3], 4, [5, [6 , [], [8, 9]], 10]], i) 

輸出

0 False 
1 True 
2 True 
3 True 
4 True 
5 True 
6 True 
7 False 
8 True 
9 True 
10 True 
11 False 

的邏輯是這樣的,

  1. 如果current_item等於我們正在查找的數量,則返回True

  2. 如果current_item不是列表的一個實例,那麼它在這種情況下是一個數字。如果它是一個數字,它不等於number,我們應該返回False

  3. 如果current_item是一個列表,然後遍歷它的每一個元素,並檢查是否有任何元素有numberany在獲得第一個True值後立即返回。

+0

對不起,我忘了指定我需要使用遞歸。 – gptt916

+3

這個*會使用遞歸 - 在最後一行看到對'search'的遞歸調用。 –

+0

你能解釋你的代碼的最後2行嗎?我明白'isinstance'和'any',但我不完全確定他們做什麼時,像這樣放在一起 – gptt916

2

如果沒有身在何處的產品列表中這樣的事情應該工作

def unpack(iterable): 
    result = [] 
    for x in iterable: 
     if hasattr(x, '__iter__'): 
     result.extend(unpack(x)) 
     else: 
     result.append(x) 
    return result 

>>> unpack([1,2,3,[4,5,6],7,[8,[9,10],11,]]) 
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11] 
+0

這是一個很好的算法,可以在您的常用工具中使用。 「itertools flatten」配方沒有這樣的東西太糟糕了。你的算法可能會更好,因爲它的解包列表可能非常大。 – IceArdor

+0

非常有趣,它對我來說很不錯,我會牢記這一點以備將來參考。但是對於這個練習,我需要設置參數並使用遞歸。謝謝你! – gptt916

-1
def search(L, s): 
    if L == s: 
     return True 

    found = False 
    if isinstance(L, list): 
     for i in range(len(L)): 
      if search(L[i], s): 
       found = True 
    return found 
+0

你能解釋你的答案嗎? – Zulu