编写filter()函数但获取typeError

时间:2015-03-11 13:54:52

标签: python python-3.x filter

我的代码包括我重新创建函数'filter()'并将其与一个函数一起使用来过滤超过5个字符的单词。当我尝试使用它时,它与实际的函数过滤器一起使用...我正在使用python 3 +

def filter1(fn, a):
    i = 0
    while i != len(a):
        u = i - 1
        a[i] = fn(a[i], a[u])
        i += 1
    return a


def filter_long_words(l):
    if len[l] > 5:
        return [l]

listered = ['blue', 'hdfdhsf', 'dsfjbdsf', 'jole']
print(list(filter1(filter_long_words, listered)))

收到错误

TypeError: filter_long_words() takes 1 positional argument but 2 were given

3 个答案:

答案 0 :(得分:1)

您在这里将两个参数传递给fn(引用filter_long_words):

a[i] = fn(a[i], a[u])

filter_long_words只接受一个参数。

注意:

  • 您可以使用for item in my_list循环浏览列表,或者如果您想要索引for index, item in enumerate(my_list)
  • 我认为您可能会获得IndexError,因为u将在您的循环的第一轮中-1
  • filter函数也可以表示为列表理解:(item for item in listered if filter_long_words(item))

如果我必须使用filter循环,我的for版本会如下所示:

def my_filter(fn, sequence):
    if fn is None:
        fn = lambda x: x
    for item in sequence:
        if fn(item):
            yield item

由于您已声明使用的是Python 3,因此返回生成器而不是列表。如果你想要它返回一个列表:

def my_filter(fn, sequence):
    if fn is None:
        fn = lambda x: x
    acc = []
    for item in sequence:
        if fn(item):
            acc.append(item)
    return acc

如果您不需要使用for循环:

def my_filter(fn, sequence):
    if fn is None:
        fn = lambda x: x
    return (item for item in sequence if fn(item))

答案 1 :(得分:1)

您在fn中使用2个参数调用filter1(fn, a),并且由于您已将filter_long_words()传递给filter1 fn,这会触发错误。

但是有更奇怪的东西:

我不理解filter1或你想要的东西 完成,但在我看来,你不知道该怎么做。 但是如果你想模仿(不知何故)filter如何运作,你必须返回一个 列表,其中仅包含fn函数返回true的项。什么时候 你知道吗,你可以重写它 - 这里有一些重写的​​建议

# explicit, inefficient and long, but straightforward version:
def filter1(fn, a):
    new_list = []
    for item in a:
        if fn(item):
            new_list.append(item):
    return new_list

# shorter version using list comprehensions:
def filter1(fn, a):
    return [item for item in a if fn(item)]

filter_long_words函数也是错误的 - 它应该返回True或 假。它可以工作的唯一原因是因为任何非空列表都是 python处理为True,函数的默认返回值为None, 转换为False。但是使用起来会让人感到困惑和语法错误 len[l] - 正确用法为len(l)。 有一些重写的​​建议,它们都返回显式的布尔值 值:

# unnecessary long, but self-explanatory:
def filter_long_words(l):
    if len(l) > 5:
        return True
    else
        return False

# short variant
def filter_long_words(l):
    return len(l) > 5

答案 2 :(得分:0)

您使用2参数=>调用“filter_long_words” fn(a [i],a [u])也有错误

def filter_long_words(l):
    if **len[l]** > 5:
        return [l]

len是内置方法,它应该是len(l)