【问题标题】:Recursively remove element from tuple从元组中递归删除元素
【发布时间】:2017-11-17 01:22:51
【问题描述】:

在获得正确结果时遇到一些问题。我试图通过递归传递一个单词元组和一个单词的项目。该方法应返回减去项目的元组。但是我收到一个错误,上面写着“必须是 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 循环、if x in y... 等)来实现此结果。

【问题讨论】:

    标签: python recursion tuples


    【解决方案1】:

    最后一个连接应该是一个单例元组,而不是元组中的一个项目 - 一个字符串。此外,相等性检查足以将元组中的项目与参数匹配,这里不需要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 实现。因此,请使用==

    【讨论】:

      【解决方案2】:

      在这一行:

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

      seq[0] 是一个str,你不能将它添加到filter_sequence 的返回值中,filter_sequence(在这一行中)是一个元组。您可能想将seq[0] 粘贴在一个元组中:

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

      【讨论】:

        【解决方案3】:

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

        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')
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-08-17
          • 1970-01-01
          • 2012-04-11
          • 1970-01-01
          • 2014-05-02
          • 2021-05-29
          • 2021-11-13
          相关资源
          最近更新 更多