簡體   English   中英

python中的lambda和過濾器

[英]lambda and filter in python

我有以下字符串,我想通過過濾 X 來解碼

garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"

我想過濾。 我嘗試了以下代碼

message = filter(lambda x: garbled.remove(x) if x == "X", garbled)

我沒有讓這種方式工作。 我找到了另一個解決方案:

message = filter(lambda x: x != "X", garbled)

但我仍然想知道為什么第一個不起作用。 我可以修嗎?

(順便說一句,我是 python 新手)謝謝!

您可以使用生成器表達式而不是filter

>>> ''.join(i for i in garbled if i != 'X')
'I am another secret message!'

如果您想使用filter ,則必須將lambda更改為

>>> ''.join(filter(lambda x: x != 'X', garbled))
'I am another secret message!'

Cory 已經修復了您的filter

在我看來,您的問題最好通過簡單的str.replace處理。

>>> garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"
>>> garbled.replace('X', '')
'I am another secret message!'
message = filter(lambda x: garbled.remove(x) if x == "X", garbled)

這段代碼不起作用,因為 lambda 函數必須是表達式。

garbled.remove(x) if x == "X"

這是陳述,不是表達。 我刪除 if x=="X" 以生成有效表達式,

message = filter(lambda x: garbled.remove(x), garbled)

接下來,我發現錯誤“'str' 對象沒有屬性 'remove'”。 因為亂碼的類型是字符串,而字符串類型中沒有命名為'remove'的屬性。 要使用過濾器函數,第一個參數必須是“謂詞”函數(返回 True 或 False),第二個參數必須是類似可迭代的。 OP的第二個解決方案滿足這個條件。 第二個參數是可迭代的字符串(字符列表),第一個參數是一個謂詞函數,它采用第二個參數字符串提供的一個字符)

filter(function, iterable)執行以下過程:

  1. 一次一個iterable的元素(即第二個參數)。
  2. 對於這些元素中的每一個,在該元素上調用function (即第二個參數)並查看它是否返回 true。
  3. 只收集那些function返回 true 的元素,並返回這些元素的新列表。

看看第 2 步中如果你傳遞lambda x: garbled.remove(x) if x == "X"會發生什么lambda x: garbled.remove(x) if x == "X" for the function parameter: filter()對自己說,“Hmm, if I set x="I" then是garbled.remove(x) if x == "X" true?"。 這就像您在filter()的第二個參數中大喊指令:“嘿,請刪除所有的"X" s”。 但這不是去那里的正確做法。 要求非常精確:它必須是一個接受元素並返回 true 或 false 值的函數。

你可以這樣做。 您在 lambda 條件中存在錯誤。 你甚至不需要string.replace()

garbled = "IXXX aXXmX aXXXnXoXXXXXtXhXeXXXXrX sXXXXeXcXXXrXeXt mXXeXsXXXsXaXXXXXXgXeX!XX"
f = lambda x: "" if x in "X" else x
message = filter(f, garbled)
"".join(message)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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