2013-09-01 92 views
1

我學習Python並在解決方案時練習,function filter()返回空列表,我無法理解爲什麼。下面是我的源代碼:Python練習中的高階函數

""" 
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

Python是不是口齒不清(不會寫這樣有代碼或者雖然),如果你不」爲獲得最難解決問題的解決方案而獲得額外的積分,請使用簡單的,慣用的方法:'[input_list中的單詞如果len(word)> n]'更清晰並且更容易理解no? – Voo

+0

@Voo:是的,但鍛鍊確實說他使用'filter()'。 –

+1

@Lennart點,家庭作業可能很愚蠢,但教授仍然喜歡,如果你這樣做,就像他們說的那樣);仍然悲慘地教人們蟒蛇這種方式。 – Voo

回答

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

n是一個字符串。使用前將其轉換爲int

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

的Python 2.x的將試圖產生一個對象的一致,但是,任意排序,沒有有意義的順序關係,使分類更加容易。這被認爲是一個錯誤,並在向後不兼容的3.x版本中發生了變化;在3.x中,這會產生一個TypeError

0

我不知道你的函數做什麼,或者你想這樣做,只是看着它給了我一個頭痛。

這裏有一個正確的答案,你的鍛鍊:

def filter_long_words(input_list, n): 
    return filter(lambda s: len(s) > n, input_list) 
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()