【问题标题】:Python nested list recursion searchPython 嵌套列表递归搜索
【发布时间】:2014-03-06 22:02:57
【问题描述】:

给定一个嵌套列表 L(这样 L 的每个元素要么是一个整数,要么是一个列表,它本身可以 包含整数或列表,它们可能反过来....等)返回 True i s is in 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]

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

感谢任何帮助!

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

【问题讨论】:

标签: python list recursion


【解决方案1】:

你可以像这样压缩你的整个代码

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 值后立即返回。

【讨论】:

  • 对不起,我忘了指定我需要使用递归。
  • 确实使用递归 - 请参阅最后一行对 search 的递归调用。
  • 您能解释一下您的代码的最后两行吗?我了解isinstanceany,但我不确定它们放在一起会做什么
  • @NickGong 现在请检查我的答案。我已经添加了基本解释。
【解决方案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]

【讨论】:

  • 这是您常用工具中的一个很好的算法。太糟糕了itertools flatten 食谱没有这样的东西。您的算法作为生成器可能会更好,因为它解包的列表可能非常大。
  • 很有趣,对我来说看起来还不错,我会记住这一点以备将来参考。但是对于这个练习,我需要设置这样的参数并使用递归。不过谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 2013-11-26
  • 2015-06-19
相关资源
最近更新 更多