2010-02-14 88 views
2

蟒蛇映射我实现了一个版本使用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 

就像我想它牛逼O操作。

除了一个事实,即有可能是使用我还没有看到内建的方式,为什么第一种方式失败,第二种方式做我需要它?

+0

我讨厌它,当一个简单的外观上的改变是不可见的我,导致我的东西不工作的权利,但我忘了我所做的改变! – 2010-02-14 04:47:44

回答

4

replacer的参数排序是两者之间的区别。如果您在第一个版本中更改了参数排序,它将表现得像第二个版本。

1

你通过它在倒退中的第一个。它应该是

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

请勿使用内置名称(例如str)作为您自己的标识符,这只是要求帮助,并且没有受益无论如何。

除此之外,你的第一个版本是循环上str,在第二参数 - 列表['e', 'l', 'o'] - 所以当然它会返回正好三个项目的字符串 - 你怎么能指望它返回任何其他长度的字符串?使用str命名列表说法是特别不正当和错误倾向。

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

+0

我知道这只是一个简单的例子,我试图展示我的朋友谁做了很多PHP – 2010-02-14 04:46:56

+0

是否有一种方法可以像内置字符串方法一样执行多个替换,或者是像这样的一小段代码我需要每一次? – 2010-02-14 04:48:45

+0

@controlfreak,字符串的'.translate'方法好得多(但是对于Python中的字节串''* *''你必须首先准备一个带有'string.maketrans'的转换表 - Unicode对象和Python 3字符串也是unicode,因为他们采取了“dict”)。 – 2010-02-14 05:01:16