2014-02-09 107 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