[英]trying to understand lambda
當我做
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'])
表明:
為什么它不顯示True。 如何獲得真實?
filter()執行以下操作:給定一個 function 和一個可迭代對象(如列表、元組等),將列表中的每個項目傳遞給 function。 對於每個項目,function 返回 boolean true 或 false。 如果 function 在某個項目上返回 true,則將該項目添加到新列表中。
過濾器完成后,它會返回包含所有選定項目的新列表。 這使您可以根據條件“過濾”列表,並且 select 僅匹配條件的項目。
這里正在發生一件棘手的事情。 filter()循環遍歷任何可迭代對象。 這包括一個字符串。 當您將 dict['Alice'] 作為 object 進行迭代時,它會傳遞 '2341',並對字符串中的每個字符運行過濾器。 您可以將過濾器的邏輯分解如下:
def matches(x):
return x == '2341'
result = ''
for char in x:
if matches(char):
result += char
print result
這不起作用,因為您的單個字符都不等於“2341”。
對我來說,您的誤解似乎與filter
有關。 您將謂詞 function 和可迭代的 object 傳遞給filter
。 它創建一個新的 object ,其中包含謂詞返回真值的第一個可迭代項(不一定是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)
()
您要測試“Alice”的條目是否為“2341”。 您可以通過
print dict['Alice'] == '2341'
您面臨的問題不在於 lambda 表單,而是在此用例中不適合的方法filter
。
一般來說,lambda 形式或多或少只不過是匿名的 function(參見例如此處)。
也許你想要做的是:
>>> dic = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}
>>> [i for i in dic if dic[i] == '2341']
['Alice']
如果您添加具有相同值的其他元素,您將在列表中獲得所有
如果您只想調用 lambda function,您只需像 function 一樣使用它:
print (lambda x: x=="2341")(dict["Alice"])
這給出了預期的結果(真)。
當您使用filter
時,它會將其第二個參數視為一個列表,因此“2341”被視為一個字符列表['2', '3', '4', '1']
,其中沒有一個等於“2341” .
我剛剛發現的有趣的事情:Python 3 從filter()
function 返回過濾器對象,所以正確使用過濾器就變成了
print( list( filter( lambda x: x, dict['Alice'] ) ) )
並且返回['2', '3', '4', '1']
可以避免最初的混淆。
通常,將filter
應用於兩個 arguments:
filter
將 function 應用於列表中的每個 object 並返回 function 為其返回True
的所有對象的列表。
在您的第二個示例中,您的第一個參數是 function,正如預期的那樣。 但是你的第二個參數不是一個列表——它是一個字符串“2341”(在字典中查找“Alice”的結果)。
(編輯:我最初弄錯了下一部分。感謝其他海報的正確處理。)過濾器將字符串視為列表,將 function 應用於每個字符並僅保留返回True
的那些字符(沒有一個) ,導致一個空字符串。 現在,如果您回顧您的第一個示例,它也有同樣的問題,而且答案是您所期望的只是(很糟糕?)運氣。
正如另一張海報所建議的那樣,也許您想更直接地應用您的 function。 在第一個示例中:
(lambda x: x)(dict['Alice'])
在第二個例子中:
(lambda x: x=="2341")(dict['Alice'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.