2010-01-28 85 views
72

我是新來的Python,來自Java和C.我如何增加一個字符?在Java或C中,字符和整數實際上是可以互換的,並且在某些循環中,能夠執行增量字符和通過字符索引數組對於我來說非常有用。Python:我如何增加一個字符?

我該如何在Python中做到這一點?沒有一個傳統的(;;)循環者已經夠糟糕了 - 有什麼辦法可以實現我想要實現的目標,而不必重新考慮我的整個策略?

任何幫助表示讚賞。

+5

我可以問,你爲什麼需要這樣做? – SilentGhost 2010-01-28 18:33:24

+1

傳統'for'循環:'我在範圍內(50):do_something_with(i)'。來吧,這並不壞! – jathanism 2010-01-28 18:39:10

+0

@SilentGhost:我正在拆分一個英文字典以用於Android應用程序。由於這個文件太大,我寫了一個Python腳本將它們分成words_aa.txt,words_ab.txt等等......我需要編寫第二個腳本來生成一個包含Ids的數組的Java文件每個單詞文件的原始文件資源(因爲我很懶),我想不出有更好的方法去做。 – 2010-01-28 18:40:31

回答

137

在Python 2.x中,只需使用ordchr功能:

>>> ord('c') 
99 
>>> ord('c') + 1 
100 
>>> chr(ord('c') + 1) 
'd' 
>>> 

Python 3.x都有使這個更有組織和更有趣,因爲在字節和Unicode之間的明顯區別。默認情況下,「字符串」是unicode,所以上述工作(ord接收Unicode字符,chr生成它們)。

但是,如果你有興趣以字節爲單位(如處理一些二進制數據流),事情就更簡單了:

>>> bstr = b'abc' 
>>> bstr[0] 
97 
>>> bytes([97, 98, 99]) 
b'abc' 
>>> bytes([bstr[0] + 1, 98, 99]) 
b'bbc' 
+2

非常快!謝謝。不過,這會讓我錯過'過去的美好時光'。 – 2010-01-28 18:29:59

+7

一切都太過艱辛的美好時光?算了吧! – jathanism 2010-01-28 18:37:43

+5

@Tom R.不要! [懷念昔日]。當你試圖快速實現某些東西或轉換一段代碼時,Python的概念和習慣用法似乎只會阻礙你的進步,而且幾乎不值得學習曲線......耐心等待!你甚至可能會發現,獲得Python的熟練程度將會提高Java(和C,在較小程度上)的風格。 – mjv 2010-01-28 18:40:33

12

「壞夠不具有傳統的(;;)尺蠖」? ?什麼?

你試圖做

import string 
for c in string.lowercase: 
    ...do something with c... 

或者,也許你正在使用string.uppercasestring.letters

Python沒有for(;;),因爲通常有更好的方法來做到這一點。它也沒有角色數學,因爲它也沒有必要。

+1

+1,試圖回答問題背後的問題(XY問題,等等)。如果可以的話,我會給你更多。 – 2010-01-28 18:59:58

+0

謝謝。我經常首先問「爲什麼?」對於這樣的問題。但@SilentGhost擊敗了我。 – 2010-01-28 19:01:48

0

我來自PHP,你可以使用++運算符來增加字符(A到B,Z到AA,AA到AB等)。我做了一個簡單的函數,它在Python中執行相同的操作。您還可以將字符列表更改爲任何(小寫,大寫等)是您的需要。

# Increment char (a -> b, az -> ba) 
def inc_char(text, chlist = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'): 
    # Unique and sort 
    chlist = ''.join(sorted(set(str(chlist)))) 
    chlen = len(chlist) 
    if not chlen: 
     return '' 
    text = str(text) 
    # Replace all chars but chlist 
    text = re.sub('[^' + chlist + ']', '', text) 
    if not len(text): 
     return chlist[0] 
    # Increment 
    inc = '' 
    over = False 
    for i in range(1, len(text)+1): 
     lchar = text[-i] 
     pos = chlist.find(lchar) + 1 
     if pos < chlen: 
      inc = chlist[pos] + inc 
      over = False 
      break 
     else: 
      inc = chlist[0] + inc 
      over = True 
    if over: 
     inc += chlist[0] 
    result = text[0:-len(inc)] + inc 
    return result