用字符串进行python映射

时间:2010-02-14 04:35:34

标签: python string map lambda

我使用python实现了php中可用的str_replace函数版本。这是我的原始代码无效

def replacer(items,str,repl):
    return "".join(map(lambda x:repl if x in items else x,str))

test = "hello world"
print test
test = replacer(test,['e','l','o'],'?')
print test

但打印出来

hello world
???

我按预期做的代码是

def replacer(str,items,repl):
    x = "".join(map(lambda x:repl if x in items else x,str))
    return x

test = "hello world"
print test
test = replacer(test,['e','l','o'],'?')
print test

打印出来

 hello world
 h???? w?r?d

就像我想要的那样。

除了可能还有一种方法可以使用我尚未见过的内置,为什么第一种方式失败,第二种方式做我需要的呢?

3 个答案:

答案 0 :(得分:4)

replacer的参数顺序是两者之间的区别。如果您在第一个版本中更改了参数排序,则其行为与第二个版本相同。

答案 1 :(得分:3)

请勿使用str等内置名称作为您自己的标识符,这只会引发问题并且没有会带来任何好处。

除此之外,您的第一个版本是str循环,第二个参数 - 列表['e', 'l', 'o'] - 所以当然它将返回一个恰好三个项目的字符串 - 你怎么能指望它返回任何其他长度的字符串?!使用str命名列表参数特别有悖常理并容易出错。

第二个版本在str上循环,第一个参数 - 字符串'hello world',所以当然它返回一个字符串长度

答案 2 :(得分:1)

你在第一个中向后传递它。它应该是

test = replacer(['e','l','o'], test, '?')