我学习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)
答案 0 :(得分: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
如果您对此感到好奇,这个问题的答案是:How does Python compare string and int?
关于代码的其余部分,您不应该创建将字符串的长度映射到字符串本身的字典。
当你有两根长度相等的琴弦时会发生什么?你应该反过来映射:strings
到它们的长度。
但更好的是:你甚至不需要创建字典:
filtered_words = filter(lambda: len(word) > n, words)
答案 1 :(得分:1)
n
是一个字符串。使用前将其转换为int
:
n = int(raw_input("Display words, that longer than...\n"))
Python 2.x将尝试为没有有意义排序关系的对象生成一致但任意的排序,以使排序更容易。这被认为是一个错误,并在向后兼容的3.x版本中发生了变化;在3.x中,这会引发TypeError
。
答案 2 :(得分:0)
我不知道你的功能是什么,或者你认为它做了什么,只是看着它让我很头疼。
以下是您锻炼的正确答案:
def filter_long_words(input_list, n):
return filter(lambda s: len(s) > n, input_list)
答案 3 :(得分: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()