【问题标题】:Can't figure out this filter() recursion error无法弄清楚这个 filter() 递归错误
【发布时间】:2015-04-12 15:32:34
【问题描述】:

问题是我必须编写一个程序,它接收一个单词列表和一个整数,并返回长度大于该整数的单词。我只能使用 filter() 。 这是我写的:

def filter(list,integer):
    largenum = list(filter(lambda x: len(x) > integer, list ))
    return largenum
inp = input("Enter the words: ").split()
intr = input("Enter the integer: ").split()

print (filter(inp,intr))

当我运行它并给出输入时,它给出了一个错误:

运行时错误:超出最大递归深度。

我做错了什么?

编辑:我明白了。如此愚蠢的错误XD。 1.) 我将 filter(list,integet) 更改为 filterthis(string,integer) 2.) intr = input("输入整数:").split() to intr = int(input("输入整数:")

【问题讨论】:

  • 1.您的递归函数缺少基本情况。它将无限递归,直到达到最大递归限制2。您将变量命名为list,它会影响内置
  • 为什么要写过滤函数?
  • "我只需要使用 filter()" ?your function or builtin filter ?

标签: python list recursion filter


【解决方案1】:

您将integer 传递为list。所以使用integer[0]。然后input 返回str。所以使用int(integer[0])

然后您将使用filter 作为您的function name。因此这将覆盖builtin 函数filter。此外,您将列表传递为variablelist。它还将覆盖@987654333 @.你可以试试这个

def myfilter(mylist,integer):
    largenum = list(filter(lambda x: len(x) > int(integer[0]), mylist ))
    return largenum
inp = input("Enter the words: ").split()
intr = input("Enter the integer: ").split()

>>>print(myfilter(inp,intr))

【讨论】:

    【解决方案2】:

    你已经编写了过滤函数,它在没有基本情况的情况下调用自己。

    重命名您的过滤器函数。

    In [8]: def my_filter(l, i):                                                                                                        
       ...:     largenum = filter(lambda x: len(x)> i, l)  # if python3, use list(filter)                                                                        
       ...:     return largenum                                                                                                         
       ...:                                                                                                                             
    
    In [9]: inp = ["LOL", "DA", "YAYASTRING"]                                                                                                                     
    
    In [10]: intr = 2                                                                                                                   
    
    In [11]: my_filter(inp, intr)                                                                                                       
    Out[11]: ['LOL', 'YAYASTRING']                                                                                                       
    

    【讨论】:

      【解决方案3】:

      您的filter 版本将隐藏具有相同名称的python 内置。因此,当您从 filter 内部调用它时,它并不是真正要调用的内置函数,而是函数本身。由于递归没有停止规则,它最终会超出允许的堆栈深度。

      list 也是如此。具有相同名称的函数参数将遮蔽内置 python list 容器。

      此外,您需要将第二个参数转换为 int,然后再将其传递给函数。

      代码:

      def fil(lst, integer):
          return filter(lambda x: len(x) > integer, lst)
      
      >>> fil(['Hello', 'how', 'are', 'you', 'doin'], 3)
      ['Hello', 'doin']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多