递归地从元组中删除元素

时间:2017-11-17 01:22:51

标签: python recursion tuples

在获得正确结果方面遇到一些问题。我试图通过递归传递一个单词元组和一个单词的项目。该方法应该返回元组减去项目。但是我收到的错误是“必须是str,而不是元组”。这是我到目前为止所拥有的。提前谢谢。

def filter_sequence(seq, item):
    try:
        if not seq:
            return ()
        elif item is seq[0]:
            return filter_sequence(seq[1:], item)
        else:
            return seq[0] + filter_sequence(seq[1:], item)
    except TypeError as e:
        print(e)

示例:
如果我致电filter_sequence(("jelly","butter", "mustard"), 'butter')
我应该收到("jelly", "mustard")

的元组 我试图在str()中包装最后一个递归调用,但后来我只得到一个字符串。我不得不分手和格式化,这不是我想做的事。

我应该提一下,我的目标是使用内置的解决方案来实现这个结果,例如for循环,while循环,如果x在y ...等等。

3 个答案:

答案 0 :(得分:2)

最后一个连接应该是单个元组,而不是元组中的项 - 字符串。此外,等式检查足以使元组中的项与参数匹配,此处不需要is

def filter_sequence(seq, item):
    if not seq:
        return ()
    elif item == seq[0]:
        return filter_sequence(seq[1:], item)
    else:
        return (seq[0],) + filter_sequence(seq[1:], item)
    #          ^^^^^^^^^

注意:由于某些CPython优化(字符串实习),is检查可能适用于代码中较小的字符串,但绝对不适用于大字符串,并且不能保证工作跨Python实现的方式相同。因此,请使用==

答案 1 :(得分:1)

在这一行:

return seq[0] + filter_sequence(seq[1:], item)

seq[0]str,您无法将其添加到filter_sequence的返回值,其中(在此行中)是一个元组。您可能希望将seq[0]添加到元组中:

return (seq[0],) + filter_sequence(seq[1:], item)

答案 2 :(得分:0)

一种更简单的方法可能是试试这个:

def filter_sequence(l, target, total):
     if not l[1:]:
         return tuple(list(total)+[l[0]])
     if l[0] == target:
         return filter_sequence(l[1:], target, total)
     return filter_sequence(l[1:], target, tuple(list(total)+[l[0]]))


print(filter_sequence(("jelly","butter", "mustard"), 'butter'))

输出:

('jelly', 'mustard')