给定一个嵌套列表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]
如何更改代码以使其适用于嵌套列表?嵌套元素在列表中的任何位置并不严格地说是最后一个元素?
感谢任何帮助!
编辑:抱歉,忘了指定它需要递归。
答案 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
逻辑是这样的,
如果current_item
等于我们要查找的号码,请返回True
。
如果current_item
不是列表的实例,则在这种情况下它是一个数字。如果它是一个数字且不等于number
,我们应该返回False
。
如果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