2011-06-15 85 views
4

當我做試圖瞭解拉姆達

dict = {'Alice': '7898', 'Beth': '9102', 'Cecil': '3258'} 
print filter(lambda x: x, dict['Alice']) 

它顯示:7898

當我做下

dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} 
print filter(lambda x: x=="2341", dict['Alice']) 

它表明:

爲什麼不顯示真正。如何獲得真實?

+1

你應該使用列表內涵,而不是'filter'和'map' – 2011-06-15 04:53:14

+3

不要使用'dict'作爲變量名。它是Python字典類型的名稱。 – 2011-06-15 05:43:12

回答

4

它看起來像你的誤解是filter,對我來說。您將謂詞函數和可迭代對象傳遞給filter。它創建一個新對象,其中包含謂詞返回真值的第一個迭代中的項目(不一定是True本身,只是測試爲true的東西)。這兩種情況下的迭代是字符串'2341',這意味着單個字母被測試。當然,字符串'2341'不等於'2','3','4''1'中的任何一個。

與一個元組嘗試它,它很容易看出這是怎麼回事:

>>> tup = tuple(dict['Alice']) 
>>> tup 
('7', '8', '9', '8') 
>>> filter(lambda x: x, tup) 
('7', '8', '9', '8') 
>>> tup 
('7', '8', '9', '8') 
>>> filter(lambda x: x, tup) 
('7', '8', '9', '8') 
>>> filter(lambda x: x=="2341", tup) 
() 
3

是否要測試'Alice'的條目是否爲'2341'。您可以通過

print dict['Alice'] == '2341' 

你所面臨的問題是不與拉姆達的形式,但該方法filter這是不是在這種使用情況適當做。

一般來說,拉姆達形式或多或少不過是一種匿名函數(參見如here)。

1

也許你正在試圖做的是:

>>> dic = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} 
>>> [i for i in dic if dic[i] == '2341'] 
['Alice'] 

如果你添加其他元素,使用相同的值,你會得到所有的然後在列表中

5

filter()執行以下操作:給出一個函數和一個可迭代(如列表,元組等),通過在每個項目該列表爲一個函數。對於每個項目,該函數返回布爾值true或false。如果該函數在某個項目上返回true,則該項目將被添加到新列表中。

過濾器結束後,它會返回包含所有選定項目的新列表。這使您可以根據標準對列表進行「過濾」,並只選擇符合條件的項目。

棘手的事情發生在這裏。 filter()通過任何可迭代循環。這包括一個字符串。當你將dict ['Alice']作爲迭代對象傳遞時,它傳遞'2341',並在字符串中的每個字符上運行過濾器。您可以按如下方式打破過濾器的邏輯:

def matches(x): 
    return x == '2341' 

result = '' 
for char in x: 
    if matches(char): 
     result += char 

print result 

這不起作用,因爲您的每個字符都不等於'2341'。

0

如果你只是想打電話給你只是用它就像一個功能的lambda函數:

print (lambda x: x=="2341")(dict["Alice"]) 

這給了預期的結果(真)。

當您使用filter時,它將其第二個參數視爲一個列表,因此「2341」被視爲['2', '3', '4', '1']的字符列表,其中沒有一個等於「2341」。

有趣的事情我才發現:從filter()功能的Python 3個返回過濾對象,所以正確使用過濾器變得

print(list(filter(lambda x: x, dict['Alice']))) 

而且返回['2', '3', '4', '1']這本來可以避免最初的混亂。

+0

2.X中的一個奇怪的區別:'filter'是一個字符串,它返回一個過濾的字符串,'filter'列表並返回一個過濾的_list_。列表推導總是返回一個列表。 – 2011-06-15 05:50:01

0

通常,一個將適用filter到兩個參數:

  1. 函數
  2. 列表(或其他迭代的對象)

filter將該函數應用於每個對象的列表,並返回函數返回的所有對象的列表True

在你的第二個例子中,你的第一個參數是一個函數,如預期的那樣。但你的第二個參數不是列表—它是一個字符串「2341」(在字典中查找「Alice」的結果)。

編輯:我這下一部分錯誤最初感謝其他海報得到它的權利。)過濾器將字符串像一個列表,應用功能,每個字符,並只保留那些爲它返回的字符True(都不是),導致一個空字符串。現在,如果你回頭看看你的第一個例子,它有同樣的問題,只有(壞)運氣,答案是你所期望的。

正如另一個海報建議,也許你想更直接地應用你的功能。在第一個例子:

(lambda x: x)(dict['Alice']) 

在第二個例子:

(lambda x: x=="2341")(dict['Alice'])