在嵌套元组中查找特定元素
这个 deep_in
函数需要接收一个元组 tup
和一个元素 elem
,如果 elem
在 tup
里面存在,就返回 True
,否则返回 False
。
def deep_in(tup, elem):
for i in range(0, len(tup)+1):
if elem == tup[i]:
return True
else:
return False
我无法让 deep_in(((),(),(3,)), 3)
返回 True
。
1 个回答
1
要处理任意嵌套的元组,你可以通过递归的方式来查找里面的元素:
def deep_in(tup, elem):
for v in tup:
if v == elem:
return True
if isinstance(v, tuple) and deep_in(v, elem):
return True
return False
或者使用any()
函数:
def deep_in(tup, elem):
return any(deep_in(v, elem) if isinstance(v, tuple) else v == elem
for v in tup)
示例:
>>> def deep_in(tup, elem):
... for v in tup:
... if v == elem:
... return True
... if isinstance(v, tuple) and deep_in(v, elem):
... return True
... return False
...
>>> deep_in(((),(),(3,)), 3)
True
>>> def deep_in(tup, elem):
... return any(deep_in(v, elem) if isinstance(v, tuple) else v == elem
... for v in tup)
...
>>> deep_in(((),(),(3,)), 3)
True
如果不使用递归,单纯用in
来测试的话,还是需要注意不要提前使用return
。
你的代码在这方面犯了个错误;如果元组中的第一个元素不等于elem
,就会立刻返回False
,这样就没法检查元组里的其他元素了。
你可以通过使用in
来检查元素,调整范围的上限,并把else:
放到for
循环外面;只有在循环结束后才返回False
:
def deep_in(tup, elem):
for i in range(len(tup)):
if elem in tup[i]:
return True
return False
不过你应该直接遍历元组,而不是使用range()
,这里也可以使用any()
:
def deep_in(tup, elem):
return any(elem in t for t in tup)