2014-03-07 63 views
0

我開始學習Python的2天前,和我被困試圖篩選特定的單詞

我有50種隨機顏色

f = ['black', 'red', 'blue', 'red', 'black', 'red', 'white', 'white', 'orange', 'black', 'orange', 'black', 'red', 'green', 'yellow', 'blue', 'blue', 'purple', 'white', 'yellow', 'green', 'black', 'orange', 'white', 'black', 'blue', 'blue', 'blue', 'orange', 'yellow', 'yellow', 'blue', 'red', 'white', 'yellow', 'blue', 'red', 'yellow', 'yellow', 'white', 'white', 'black', 'purple', 'red', 'orange', 'orange', 'blue', 'orange', 'black', 'red'] 

的清單,我想找回多少一種顏色的有在列表中,所以我嘗試使用過濾器和Len

當我嘗試

和過濾,

filter(lambda x:'red', f) 

它返回完整列表,所以當我使用len()它給了我50.

我在哪裏出錯我的過濾器?我試過瀏覽文檔,但似乎無法找到任何東西,只能繼續尋找。

任何提示?

我的作業規範規定,

「(優秀)使用地圖上的顏色來計算(使用過濾器,並減少或LEN)每種顏色的子任務3.打印結果的結果往往是如何發生 。 「

雖然數量看起來更容易

回答

1

假設你的意思來篩選red所有的值,用filterlambda

>>> filter(lambda x: x != 'red', f) 
['black', 'blue', 'black', 'white', 'white', 'orange', 'black', 'orange', 'black 
', 'green', 'yellow', 'blue', 'blue', 'purple', 'white', 'yellow', 'green', 'bla 
ck', 'orange', 'white', 'black', 'blue', 'blue', 'blue', 'orange', 'yellow', 'ye 
llow', 'blue', 'white', 'yellow', 'blue', 'yellow', 'yellow', 'white', 'white', 
'black', 'purple', 'orange', 'orange', 'blue', 'orange', 'black'] 

使用列表理解:

>>> [x for x in f if x != 'red'] 

或發電機與list()一起表達:

>>> list(x for x in f if x != 'red') 

你與

filter(lambda x:'red', f) 

遇到的問題是,你不'red'比較f的元素。本質上,該函數返回一個新列表,其中包含來自f的所有元素。以上任何方法都將過濾列表中的所有'red'值。

如果你想用這種方法來獲得'red'元素(而不是list.count你應該),那麼數量:

>>> len(filter(lambda x: x == 'red', f)) 
8 
1

你的lambda函數實際上沒有做任何的比較:它只是返回字符串'red'每次都是True,所以沒有項目被過濾掉。您需要實際字符串以一個最被傳遞到拉姆達,即x比較:

filter(lambda x: x == 'red', f) 
+0

+1該死的是一個簡單的錯誤.... – dhali

1

我想取回多少一種顏色出現在列表中,

您不必過濾,創建一個新列表,然後查找它的長度。只需使用list.count功能,這樣

print f.count('red') 
1

你是故意使用filterlambda如果你想獲得的項目數,您可以使用list類型的count方法:

>>> f = ['black', 'red', 'blue', 'red', 'black', 'red', 'white', 'white', 'orange', 'black', 'orange', 'black', 'red', 'green', 'yellow', 'blue', 'blue', 'purple', 'white', 'yellow', 'green', 'black', 'orange', 'white', 'black', 'blue', 'blue', 'blue', 'orange', 'yellow', 'yellow', 'blue', 'red', 'white', 'yellow', 'blue', 'red', 'yellow', 'yellow', 'white', 'white', 'black', 'purple', 'red', 'orange', 'orange', 'blue', 'orange', 'black', 'red'] 
>>> f.count("red") 
8 
1

字典將是最適合你的情況imho :)

f = ['黑色','藍色','黑色','白色','白色','橙色','黑色','橙色' ,「黑色」,「綠色」,「黃色」,「藍色」,「藍色」,「紫色」,「白色」 ,'黃','綠','黑','橙','白','黑','藍','藍','藍','橙','黃','黃' ,'blue','white','yellow','blue','yellow','yellow','white','white','black','purple','orange','orange','藍」,‘橙’,‘黑’]

dictionary = {} 
for i in f: 
    if i in dictionary: 
     dictionary[i] += 1 
    else: 
     dictionary[i] = 0 
1

count是好的一種顏色,但如果你想查詢多次:

>>> from collections import defaultdict 

>>> def get_as_count_dict(ls): 
     res = defaultdict(int) 
     for word in ls: 
      res[word] += 1 
     return res 


>>> r = get_as_count_dict(['red', 'red', 'blue', 'pink']) 
>>> r['red'] 
2 

>>> r['nope'] 
0 

或者,我們可以直接使用Counter

>>> from collections import Counter 

>>> r = Counter(['red', 'red', 'blue', 'pink']) 
>>> r['red'] 
2 

>>> r['nope'] 
0 
+0

工程出色!,但不想複製粘貼你的答案將閱讀文檔 – dhali