Comment puis-je incrémenter un caractère?

103

Je suis nouveau dans Python, venant de Java et C. Comment puis-je incrémenter un caractère? En Java ou C, les caractères et les entiers sont pratiquement interchangeables, et dans certaines boucles, il m'est très utile de pouvoir incrémenter les caractères et indexer les tableaux par caractères.

Comment puis-je faire cela en Python? C'est déjà assez mauvais de ne pas avoir de boucleur for (;;) traditionnel - y a-t-il un moyen de réaliser ce que je veux réaliser sans avoir à repenser toute ma stratégie?

Tom R
la source
4
Traditionnel forboucle: for i in range(50): do_something_with(i). Allez, ce n'est pas si mal !!
jathanism
@SilentGhost: Je divise un dictionnaire anglais pour l'utiliser dans une application Android. Parce que le fichier individuellement est trop gros, j'ai écrit un script Python pour les diviser en words_aa.txt, words_ab.txt, etc ... J'avais besoin d'écrire un deuxième script pour générer un fichier Java avec un tableau contenant les Ids des ressources du fichier brut de chaque fichier Word (parce que je suis paresseux), et je ne pouvais pas penser à une meilleure façon de le faire.
Tom R
3
vous semblez chercher quelque chose comme[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost
1
@SilentGhost: Est-ce tout ce qu'il faut? Si seulement il était dit dans le manuel.
Tom R

Réponses:

179

Dans Python 2.x, utilisez simplement les fonctions ordet chr:

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

Python 3.x rend cela plus organisé et intéressant, en raison de sa distinction claire entre les octets et unicode. Par défaut, une "chaîne" est unicode, donc ce qui précède fonctionne ( ordreçoit les caractères Unicode et les chrproduit).

Mais si vous êtes intéressé par les octets (comme pour le traitement de certains flux de données binaires), les choses sont encore plus 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
la source
5
@Tom R. Ne le faites pas! [manquez le bon vieux temps]. Alors que vous essayez de réaliser rapidement quelque chose ou de convertir un morceau de code, les concepts et les expressions idiomatiques de Python peuvent sembler simplement entraver votre progression et valoir à peine la courbe d'apprentissage ... Soyez patient! Vous constaterez peut-être même que maîtriser Python améliorera votre style en Java (et en C, dans une moindre mesure).
mjv
a fonctionné comme un charme. <br> Le seul changement que je ferais est pour z, auquel cas j'ai attribué un «a».
user45949
15

"assez mauvais de ne pas avoir de boucleur for (;;) traditionnel" ?? Quoi?

Essayez-vous de faire

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

Ou peut-être que vous utilisez string.uppercaseou string.letters?

Python n'a pas, for(;;)car il existe souvent de meilleures façons de le faire. Il n'a pas non plus de calcul de caractères car ce n'est pas nécessaire non plus.

S.Lott
la source
1
+1 pour avoir tenté de répondre à la question derrière la question (problème XY, etc.). Si je pouvais, je vous en donnerais plus.
Devin Jeanpierre
Merci. Je suis souvent le premier à demander "pourquoi?" pour des questions comme celle-ci. Mais @SilentGhost m'a battu.
S.Lott
3

Je viens de PHP, où vous pouvez incrémenter char (A à B, Z à AA, AA à AB, etc.) en utilisant l'opérateur ++. J'ai créé une fonction simple qui fait la même chose en Python. Vous pouvez également changer la liste des caractères en ce qui vous convient (minuscules, majuscules, 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
la source
2

Il existe un moyen d'augmenter le caractère en utilisant ascii_lettersfrom stringpackage qui ascii_lettersest une chaîne contenant tout l'alphabet anglais, majuscules et minuscules:

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

Cela peut également être fait manuellement;

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

Vérifiez ceci: UTILISATION POUR LOOP

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

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

print(doubleChar("amar"))

production:

aammaarr
Amar Tanwar
la source