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

时间:2014-04-15 09:10:47

标签: python

deep_in接收元组tup和元素elem returns True如果elem存在于tup中,False则存在。

def deep_in(tup, elem):
    for i in range(0, len(tup)+1):
        if elem == tup[i]:
            return True
        else:
            return False

我无法True

返回deep_in(((),(),(3,)), 3)

1 个答案:

答案 0 :(得分: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触发立即return 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)