Python嵌套列表递归搜索

时间:2014-02-09 17:41:30

标签: python list recursion

给定一个嵌套列表L(这样L的每个元素都是一个整数,或者一个列表,它本身就可以 包含整数或列表,它们可以反过来......等等)返回True我在L。

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]

如何更改代码以使其适用于嵌套列表?嵌套元素在列表中的任何位置并不严格地说是最后一个元素?

感谢任何帮助!

编辑:抱歉,忘了指定它需要递归。

3 个答案:

答案 0 :(得分:6)

您可以像这样挤压整个代码

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是一个列表,则遍历它的每个元素并检查是否有任何元素number。获取第一个any值后,True会立即返回。

答案 1 :(得分: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]

答案 2 :(得分:-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