2013-03-29 48 views
0

Python中使用字符串替換方法,我有以下代碼:使用循環

secretWord = 'hello' 
letter = 'l' 
tag = '_ '*len(secretWord) # tag = '_ _ _ _ _' 

for m in rage(len(secretWord)): 
    if letter == secretWord[m] and m == 0: 
     tag.replace(tag[m],letter) 
    else: 
     tag.replace(tag[m+2],letter) 

期望放出來,我想是tag = '_ _ l l _' 由於某種原因,我根本無法雖然我的邏輯是這樣的,甚至工作完全準確。我有一個for循環遍歷每個字符在secretWord中,如果字母然後在for循環中等於那個特定字符,用這個字母替換標籤中的適當位置,並保留所有其他空格('_')相同。

+3

替換不就地修改,它返回。因此,'tag = tag.replace(...)' – sberry

+0

再次審視這個問題,您的問題更多的是不重新分配帶有'tag.replace'返回值的標籤。你也試圖用'tag [m]'或'tag [m + 2]'來代替一個特定的'_',但這不會做你認爲的事情。請參閱@ unutbu的答案。 – sberry

+0

你也可以使用正則表達式:'tag =''.join(re.sub('[^%s]'%letter,'_',secret_word))' – jfs

回答

1

tag成爲已知或空白字符的列表。 使用' '.join(tag)可以在需要時顯示錶格。


secretWord = 'hello' 
letter = 'l' 

tag = ['_']*len(secretWord) 
tag = [(letter if m == letter else t) for m, t in zip(secretWord, tag)] 

print(' '.join(tag)) 
# _ _ l l _ 

這裏有一些鏈接,其解釋在這個解決方案中使用的工具:

  • [expr for variable in iterable]list comprehension
  • letter if m == letter else tconditional expression
  • zip用於將secretWord中的字母與 tag中的字母配對。
  • ' '.join用於將字母列表合併成一個字符串,每個字母之間有一個空格。
+1

全面,簡潔和正確。這甚至可以解決OP代碼的其他問題。 – sberry

+0

@unutbu這正是我所需要的,我是python的新手,所以我不習慣這篇文章中展示的風格,但同意這是我見過的最好的風格。我還必須瞭解連接方法和zip函數。這就是我喜歡SO的原因。 –

3

字符串在Python中是不可變的,你不能修改它們。這就是爲什麼你的tag沒有更新。

Python有一個非常奇怪的,但有用的數據模型。有些類型是可變的(例如列表和字典),有些是不可變的(例如字符串和數字)。

字符串實例(實際上所有其他字符串函數)的replace()函數不能修改字符串。相反,它會返回原始字符串的新修改版本。

python和C/C++之類的非託管編程語言之間的一個更大的區別是,在python變量中總是引用值,而在C/C++變量中卻是值的實際存儲。

奇怪的是,當用python開始時,這可以在一定程度上被忽略,因爲某些算法的語法是相同的。類似:

a = 7 
a += 35 
s = "Hello" 
s += " World" 

產生a = 42s = "Hello World"在Python和C/C++。對於C/C++來說這很明顯,但是在python中完全不明顯。

在Python中s首先引用字符串"Hello"(不是:s包含字符串"Hello")。然後將字符串Hello和字符串World連接起來,然後將參考s復位爲指向新字符串"Hello World"

接下來就是a = b總是表示:複製引用。它永遠不會複製該值。對於字符串和整數,它在實踐中沒有太大的區別,但是對於更復雜的類型它確實是這樣。但現在這可能超過這個問題。

+0

OP的代碼還存在另一個問題,如果您想解決它,請參閱我的評論。 – sberry