[英]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)
執行以下過程:
iterable
的元素(即第二個參數)。function
(即第二個參數)並查看它是否返回 true。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.