在嵌套元组中查找特定元素

0 投票
1 回答
604 浏览
提问于 2025-04-18 02:47

这个 deep_in 函数需要接收一个元组 tup 和一个元素 elem,如果 elemtup 里面存在,就返回 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)

撰写回答