1

我学习 Python 并在解决方案中进行练习,函数 filter() 返回空列表,我不明白为什么。这是我的源代码:

"""
Using the higher order function filter(), define a function filter_long_words()
that takes a list of words and an integer n and returns
the list of words that are longer than n.
"""

def filter_long_words(input_list, n):
    print 'n = ', n
    lengths = map(len, input_list)
    print 'lengths = ', lengths
    dictionary = dict(zip(lengths, input_list))
    filtered_lengths = filter(lambda x: x > n, lengths) #i think error is here
    print 'filtered_lengths = ', filtered_lengths
    print 'dict = ',dictionary
    result = [dictionary[i] for i in filtered_lengths]
    return result

input_string = raw_input("Enter a list of words\n")
input_list = []
input_list = input_string.split(' ')
n = raw_input("Display words, that longer than...\n")

print filter_long_words(input_list, n)
4

4 回答 4

4

您的功能filter_long_words工作正常,但错误源于这样一个事实:当您这样做时:

n = raw_input("Display words, that longer than...\n")
print filter_long_words(input_list, n)  

n是一个字符串,而不是一个整数。

不幸的是,字符串总是比 Python 中的整数“更大”(但无论如何你都不应该比较它们!):

>>> 2 > '0'
False

如果你很好奇为什么,这个问题有答案:Python 如何比较字符串和整数?


关于其余代码,您不应创建将字符串长度映射到字符串本身的字典。

当你有两个长度相等的字符串时会发生什么?你应该反过来映射:strings到它们的长度。

但更好的是:您甚至不需要创建字典:

filtered_words = filter(lambda: len(word) > n, words)
于 2013-09-01T11:22:37.627 回答
1

n是一个字符串。int在使用之前将其转换为:

n = int(raw_input("Display words, that longer than...\n"))

Python 2.x 将尝试为没有有意义的排序关系的对象生成一致但任意的排序,以使排序更容易。这被认为是一个错误,并在向后不兼容的 3.x 版本中进行了更改;在 3.x 中,这会引发TypeError.

于 2013-09-01T11:22:09.957 回答
0

我不知道你的函数是做什么的,或者你认为它是做什么的,光是看着就让人头疼。

这是您练习的正确答案:

def filter_long_words(input_list, n):
    return filter(lambda s: len(s) > n, input_list)
于 2013-09-01T11:23:24.617 回答
0

我的答案:

def filter_long_words():
     a = raw_input("Please give a list of word's and a number: ").split()
     print "You word's without your Number...", filter(lambda x: x != a, a)[:-1]

filter_long_words()    
于 2017-03-04T18:36:27.587 回答