2013-08-26 43 views
-1

我是新來的python,我真的找不到辦法做到這一點。如何在for循環中編輯字符串字母

我想根據某些條件更改字符串的字母。以下是代碼:

for c in text: 
    ordChar=ord(c) 
    if ordChar>=65 and ordChar<=90: 
     ordChar=ordChar+13 
     if ordChar>90: 
      ordChar=ordChar-90+64 
     c=chr(ordChar) 
    else: 
     if ordChar>=97 and ordChar<=122: 
      ordChar=ordChar+13 
      if ordChar>122: 
       ordChar=ordChar-122+96 
      c=chr(ordChar) 
return text 

返回的text的值與參數值相同。我認爲變量是指針,所以編輯c,它應該編輯text。我究竟做錯了什麼?

+6

在Python中,字符串是**不可變的**。這意味着您無法編輯字符串的單個部分,因爲您正試圖在此處進行編輯。您只是將'c'設置爲不同的值 – scohe001

+2

您是否試圖實施rot13?看看一些很好/乾淨的方式來做到這一點:http://stackoverflow.com/q/3269686/298479 – ThiefMaster

+2

@Josh:即使他們是可變的,這裏使用的方法將無法正常工作。 'a = [1,2,3];對於c:\ n c = None'不會改變'a'。 (當然你需要 –

回答

5

你不是「編輯」c,你將它分配給其他東西。一種替代方法是建立一個新的字符串,而不是試圖改變舊的(這是不可能的),然後,而不是c=...,你將有newstr += ...

2

正如我在我的評論中解釋的,Python中的字符串是不可變的,所以你需要創建一個新字符串,你不能簡單地編輯舊字符串。您的代碼可以成爲:

new_text = "" 
for c in text: 
    ordChar=ord(c) 
    if ordChar>=65 and ordChar<=90: 
     ordChar=ordChar+13 
     if ordChar>90: 
      ordChar=ordChar-90+64 
     c=chr(ordChar) 
    else: 
     if ordChar>=97 and ordChar<=122: 
      ordChar=ordChar+13 
      if ordChar>122: 
       ordChar=ordChar-122+96 
      c=chr(ordChar) 
    new_text += c 
return new_text 
2

要麼建立一個新的字符串作爲arshajii的和Josh的答案,或使用map或列表理解應用轉換字符一個字符。 (無論哪種方式,你是一個新的字符串,而不是將原來的。)

def convert_char(c): 
    code = ord(c) 
    if 65 <= code <= 90: 
     code += 13 
     if code > 90: 
      code -= 26 
    elif 97 <= ord(c) <= 122: 
     code += 13 
     if code > 122: 
      code -= 26 
    return chr(code) 

print ''.join(map(convert_char, "Testing")) 

有這樣做等幾更好的方法:

def convert_char(c): 
    if 'a' <= c <= 'z': 
     return chr(97 + (ord(c) - 6) % 26) 
    elif 'A' <= c <= 'Z': 
     return chr(65 + ord(c) % 26) 
    return c 

from string import lowercase, uppercase 
def convert_char(c): 
    if c in lowercase: 
     return lowercase[(lowercase.index(c) + 13) % 26] 
    if c in uppercase: 
     return uppercase[(uppercase.index(c) + 13) % 26] 
    return c 

(在評論中的鏈接更早的答案有更多。)