如何递增一个字符?

118

我是一名Java和C程序员,最近开始接触Python。请问如何对字符进行加1操作?在Java或C中,字符和整数几乎可以互换,在某些情况下,我可以通过增加字符来索引数组等操作,非常实用。

那么在Python中怎么做呢?不仅没有传统的for(;;)循环,还想做我想做的事情,怎么避免重新考虑我的整个策略呢?


4
传统的 for 循环:for i in range(50): do_something_with(i)。来吧,这并不难! - jathanism
@SilentGhost:我正在将一个英语词典拆分为在Android应用程序中使用。因为单个文件太大了,所以我编写了一个Python脚本将它们拆分成words_aa.txt,words_ab.txt等文件... 我需要编写第二个脚本来生成一个Java文件,其中包含每个单词文件的原始文件资源的Id数组(因为我很懒),而且我想不出更好的方法来完成它。 - Tom R
3
看起来你正在寻找类似于[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]这样的东西。该代码可以生成由小写字母组合而成、长度为2的所有可能字符串。 - SilentGhost
1
@SilentGhost:就这些吗?如果手册上有写就好了。 - Tom R
7个回答

198
在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 = bytes('abc', 'utf-8')
>>> bstr
b'abc'
>>> bstr[0]
97
>>> bytes([97, 98, 99])
b'abc'
>>> bytes([bstr[0] + 1, 98, 99])
b'bbc'

5
@Tom R. 不要错过旧时光。当你试图快速实现某个目标或转换一段代码时,Python的概念和习语可能会显得阻碍你的进展,学习曲线也不值得。耐心些!你甚至可能发现,熟练掌握Python会提高你在Java(以及稍微一点的C)中的编码风格。 - mjv
像魔法般好用。唯一改变我会做的是对于 z,我已经分配了一个 'a'。 - user45949

16
"bad enough not having a traditional for(;;) looper"?什么意思?
你是想要做什么?
import string
for c in string.lowercase:
    ...do something with c...

或者你正在使用 string.uppercasestring.letters 呢?

Python没有 for(;;),因为通常有更好的方法来实现。它也没有字符运算,因为它不是必要的。


6

请查看:使用for循环

for a in range(5):
    x='A'
    val=chr(ord(x) + a)
    print(val)

循环输出: A B C D E


4

可以使用来自 string 包的 ascii_letters 来增加字符,其中 ascii_letters 是一个字符串,包含所有英文字母,包括大写和小写字母:

>>> from string import ascii_letters
>>> ascii_letters[ascii_letters.index('a') + 1]
'b'
>>> ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

也可以手动完成;
>>> letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> letters[letters.index('c') + 1]
'd'

4

我来自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

0
def doubleChar(str):
    result = ''
    for char in str:
        result += char * 2
    return result

print(doubleChar("amar"))

输出:

aammaarr

-1

对我来说,我把以下内容作为测试。

string_1="abcd"

def test(string_1):
   i = 0
   p = ""
   x = len(string_1)
   while i < x:
    y = (string_1)[i]
    i=i+1
    s = chr(ord(y) + 1)
    p=p+s

   print(p)

test(string_1)

你使用了与被接受的答案相同的逻辑,那么提供类似解决方案的新答案有什么意义呢? - Ruli
我喜欢整洁的代码,在这个部分中没有看到任何满足我的解决方案,因此我提出了我的两分钱。 - Milan Popovic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接