你不能那么容易地做到这一点,如果你可以的lambda
函数仍然不是为你的用例设计的。
像这样的多个替换使用常规的for
循环语句完成,并且lambda
仅限于单个表达式。如果你必须使用一个函数,使用一个普通的函数 - 它完全等价于一个lambda函数,除了它不限于单个表达式。
如果你真的必须知道如何做一个单一的表达,你有三种选择:
1)如果你使用unicode
字符串(或Python 3),并限制你的坏子单字符(即删除"\newline"
),您可以使用unicode.translate
方法。
bad_chars = {u"\n": u" ", u"\b": u" ", u"\f": u" ", u"\r": u" ", u"\t": u" ", u"\v": u" ", u"\x00": u" "}
bad_chars_table = dict((ord(k), v) for k, v in bad_chars.iteritems())
translator = lambda s: s.translate(bad_chars_table)
print translator(u"here\nwe\tgo")
2)使用正则表达式:
translator = lambda s: re.sub(r'[\n\b\f\r\t\v\x00]', ' ', s)
3)您可以使用reduce
可用于使用二进制操作,以减少序列,基本上是重复调用的两个参数的函数与当前值和序列的一个元素来获得下一个值。
translator = lambda s: reduce(lambda x, (from, to): x.replace(from, to), bad_chars.iteritems(), s)
正如你所看到的,最后的解决办法是更难理解比:
def translator(s):
for original, replacement in bad_chars.iteritems():
s = s.replace(original, replacement)
return s
而且这两种解决方案做同样的事情。最后编程通常更好,而不是手段。对于任意问题,根本不存在可理解的单一表达式解决方案。
为什么你的代码打印'stri'很多很多次?调用lambda函数后打印一次。 –
它为字典中的每个项目打印一次'stri',其中1个字符最多改变了一次(它只是在对字符串进行1次更改后每次迭代我的for循环时都会打印)。 – Rell3oT
'“\ newline”'是坏字符''\ n'' - 您已经替换 - 然后是'ewline' - 这些都是不应该被替换的普通字母。 –