无法弄清楚这个filter()递归错误

时间:2015-04-12 06:23:27

标签: python list recursion filter

问题是我必须编写一个程序,它接受一个单词列表和一个整数,并返回长度大于该整数的单词。我只能使用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.)我将过滤器(list,integet)更改为filterthis(字符串,整数) 2.)intr = input("输入整数:")。split()到intr = int(输入("输入整数:")

3 个答案:

答案 0 :(得分:1)

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

重命名过滤器功能。

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

答案 1 :(得分:1)

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

然后您使用filter作为function name。这样会覆盖builtin函数filter。此外,您将列表作为variable { {1}}。它也会覆盖list。您可以试试这个

builtin callable list

答案 2 :(得分:0)

您的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']