Come posso incrementare un carattere?


103

Sono nuovo in Python, vengo da Java e C. Come posso incrementare un carattere? In Java o C, i caratteri e gli interi sono praticamente intercambiabili e, in alcuni cicli, è molto utile per me essere in grado di incrementare i caratteri e gli array di indice per caratteri.

Come posso farlo in Python? È già abbastanza brutto non avere un tradizionale looper for (;;): c'è un modo per ottenere ciò che voglio senza dover ripensare la mia intera strategia?


4
Tradizionale forciclo: for i in range(50): do_something_with(i). Dai, non è così male !!
jathanism

@ SilentGhost: sto suddividendo un dizionario inglese da utilizzare in un'app Android. Poiché il file individualmente è troppo grande, ho scritto uno script Python per dividerli in words_aa.txt, words_ab.txt, ecc ... Avevo bisogno di scrivere un secondo script per generare un file Java con un array contenente gli ID delle risorse di file raw di ogni file word (perché sono pigro), e non potrei pensare a un modo migliore per farlo.
Tom R

3
sembra che tu stia cercando qualcosa come[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost,

1
@ SilentGhost: è tutto ciò che serve? Se solo fosse detto nel manuale.
Tom R

Risposte:


178

In Python 2.x, usa semplicemente le funzioni orde chr:

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

Python 3.x lo rende più organizzato e interessante, grazie alla sua chiara distinzione tra byte e unicode. Per impostazione predefinita, una "stringa" è unicode, quindi quanto sopra funziona ( ordriceve i caratteri Unicode e chrli produce).

Ma se sei interessato ai byte (ad esempio per l'elaborazione di alcuni flussi di dati binari), le cose sono ancora più semplici:

>>> 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. Non farlo! [mancano i vecchi tempi]. Mentre stai cercando di ottenere rapidamente qualcosa o convertire un pezzo di codice, i concetti e gli idiomi di Python possono sembrare semplicemente ostacolare i tuoi progressi e difficilmente valgono la curva di apprendimento ... Sii paziente! Potresti anche scoprire che acquisire competenza in Python migliorerà il tuo stile in Java (e C, in misura minore).
mjv

ha funzionato come un fascino. <br> L'unico cambiamento che farei è per z, nel qual caso ho assegnato una "a".
user45949

15

"già abbastanza brutto non avere un tradizionale for (;;) looper" ?? Che cosa?

Stai cercando di fare

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

O forse stai usando string.uppercaseo string.letters?

Python non ce l'ha for(;;)perché spesso ci sono modi migliori per farlo. Inoltre non ha la matematica dei caratteri perché non è nemmeno necessaria.


1
+1 per aver cercato di rispondere alla domanda alla base della domanda (problema XY e così via). Se potessi, ti darei di più.
Devin Jeanpierre

Grazie. Spesso sono il primo a chiedere "perché?" per domande come questa. Ma @SilentGhost mi ha battuto.
S.Lott

3

Vengo da PHP, dove puoi incrementare il carattere (da A a B, da Z ad AA, da AA ad AB ecc.) Usando l'operatore ++. Ho creato una semplice funzione che fa lo stesso in Python. Puoi anche cambiare l'elenco di caratteri in qualsiasi cosa (minuscolo, maiuscolo, ecc.) È necessario.

# 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

2

C'è un modo per aumentare il carattere usando ascii_lettersfrom stringpackage che ascii_lettersè una stringa che contiene tutto l'alfabeto inglese, maiuscolo e minuscolo:

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

Inoltre può essere fatto manualmente;

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

1

Controlla questo: USING FOR LOOP

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


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

print(doubleChar("amar"))

produzione:

aammaarr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.