2010-02-14 87 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