使用lambda函数实现多个字符串replace()

时间:2011-08-20 20:08:41

标签: python

我发现很多解决方案正在完成我正在尝试做的事情而没有lambda ......但我今天正在学习lambda ......

我有一个字符串stri,我正在尝试替换stri中存储在字典中的一些字符。

bad_chars={"\newline":" ","\n": " ", "\b":" ", "\f":" ", "\r":" ", "\t":" ", "\v":" ", "\0x00":" "}然后我想打印stri所有这些丑陋的角色。我当前的代码打印stri很多次。

format_ugly = lambda stri: [ stri.replace(i,j) for i,j in bad_chars.iteritems()]

有没有办法让它打印一次,只有1个lambda函数?

3 个答案:

答案 0 :(得分:2)

如果你真的想要,可以强制使用lambda函数:

print ''.join(map(lambda x: bad_chars.get(x, x), stri))

但实际上这里绝对不需要使用lambda函数。您所需要的只是:

print ''.join(bad_chars.get(x, x) for x in stri)

此解决方案也是线性时间(即O(n)),而所有其他解决方案都可能是二次方,因为它们涉及扫描整个字符串以替换每个值O(n * m),其中m是{{的大小1}} dict。

示例:

bad_chars

Ouptut:

bad_chars= {"\newline":" ","\n": " ", "\b":" ", "\f":" ", "\r":" ", "\t":" ", "\v":" ", "\0x00":" "}
stri = "a \b string\n with \t lots of \v bad chars"
print ''.join(bad_chars.get(x, x) for x in stri)

答案 1 :(得分:1)

您不应该生成值列表。您的代码生成一个包含原始文本的值列表,只替换了一个字符(每个版本一个)。而是操作一个条目的结果并将其传递给下一个条目。这几乎是减少的原因:

replaced = reduce(lambda stri, r: stri.replace(r[0], r[1]), bad_chars.iteritems(), original)

这大致相当于:

stri.replace(r0[0], r0[1]).replace(r1[0], r1[1]).replace(...)

其中r0..rn是来自bad_chars.iteritems()的值。

答案 2 :(得分:0)

你不能那么容易地做到这一点,如果你的lambda功能仍然不适合你的用例。

使用常规for循环语句完成多次替换,而lambda仅限于单个表达式。如果你必须使用一个函数,使用一个普通的函数 - 它完全等同于一个lambda函数,除了它不限于一个表达式。

如果你真的必须知道如何在一个表达式中做到这一点,你有三个选择:

1)如果您使用unicode字符串(或Python 3),并将错误的子字符串限制为单个字符(即删除"\newline"),则可以使用unicode.translate方法。< / p>

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

两种解决方案都做同样的事情。通常最好为最终目标而不是手段。对于任意问题,根本不存在可理解的单表达式解决方案。