Como posso incrementar um char?

103

Sou novo em Python, vindo de Java e C. Como posso incrementar um char? Em Java ou C, chars e ints são praticamente intercambiáveis ​​e, em certos loops, é muito útil para mim ser capaz de incrementar chars e indexar arrays por chars.

Como posso fazer isso em Python? Já é ruim o suficiente não ter um looper tradicional para (;;) - há alguma maneira de conseguir o que desejo sem ter que repensar toda a minha estratégia?

Ao Sr
fonte
4
Tradicional forloop: for i in range(50): do_something_with(i). Vamos lá, isso não é tão ruim !!
jathanismo de
@SilentGhost: Estou dividindo um dicionário de inglês para usar em um aplicativo Android. Como o arquivo individualmente é muito grande, escrevi um script Python para dividi-los em words_aa.txt, words_ab.txt, etc ... Eu precisei escrever um segundo script para gerar um arquivo Java com um array contendo os Ids dos recursos de arquivo bruto de cada arquivo de palavra (porque sou preguiçoso), e não consegui pensar em uma maneira melhor de fazer isso.
Tom R
3
você parece estar procurando por algo como[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost
1
@SilentGhost: Isso é tudo o que preciso? Se apenas dissesse no manual.
Tom R

Respostas:

178

No Python 2.x, basta usar as funções orde chr:

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

Python 3.x torna isso mais organizado e interessante, devido à sua clara distinção entre bytes e unicode. Por padrão, uma "string" é unicode, então o acima funciona ( ordrecebe caracteres Unicode e os chrproduz).

Mas se você estiver interessado em bytes (como para processar algum fluxo de dados binários), as coisas são ainda mais simples:

>>> 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'
Eli Bendersky
fonte
5
@Tom R. Não! [saudades dos velhos tempos]. Como você está tentando alcançar algo rapidamente ou converter um trecho de código, os conceitos e expressões idiomáticas do Python podem parecer apenas impedir o seu progresso e dificilmente valer a pena a curva de aprendizado ... Seja paciente! Você pode até descobrir que ganhar proficiência em Python melhorará seu estilo em Java (e em C, em menor grau).
mjv
funcionou como um encanto. <br> A única mudança que eu faria é para z; nesse caso, atribuí um 'a'.
user45949,
15

"ruim o suficiente não ter um tradicional para (;;) looper" ?? O que?

Você está tentando fazer

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

Ou talvez você esteja usando string.uppercaseou string.letters?

O Python não tem for(;;)porque geralmente há maneiras melhores de fazer isso. Também não tem matemática de personagem porque também não é necessária.

S.Lott
fonte
1
1 por tentar responder à pergunta por trás da pergunta (problema XY e assim por diante). Se eu pudesse, te daria mais.
Devin Jeanpierre
Obrigado. Freqüentemente sou o primeiro a perguntar "por quê?" para perguntas como esta. Mas @SilentGhost chegou antes de mim.
S.Lott
3

Eu vim do PHP, onde você pode incrementar char (A para B, Z para AA, AA para AB etc.) usando o operador ++. Fiz uma função simples que faz o mesmo em Python. Você também pode alterar a lista de caracteres para o que for necessário (minúsculas, maiúsculas, etc.).

# 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
xpuu
fonte
2

Existe uma maneira de aumentar o caractere usando ascii_lettersfrom stringpackage, que ascii_lettersé uma string que contém todo o alfabeto inglês, maiúsculas e minúsculas:

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

Também pode ser feito manualmente;

>>> letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> letters[letters.index('c') + 1]
'd'
Moein Kameli
fonte
1

Verifique isto: USANDO PARA LOOP

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

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

print(doubleChar("amar"))

resultado:

aammaarr
Amar Tanwar
fonte