簡體   English   中英

試圖了解 lambda

[英]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:

  1. 一個 function
  2. 列表(或其他可迭代對象)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM