¿Cómo puedo incrementar un carácter?

103

Soy nuevo en Python, vengo de Java y C. ¿Cómo puedo incrementar un carácter? En Java o C, los caracteres e ints son prácticamente intercambiables, y en ciertos bucles, es muy útil para mí poder hacer incrementos de caracteres e indexar matrices por caracteres.

¿Cómo puedo hacer esto en Python? Ya es bastante malo no tener un bucleador tradicional de for (;;): ¿hay alguna forma de lograr lo que quiero lograr sin tener que repensar toda mi estrategia?

Al sr
fuente
4
Tradicional forbucle: for i in range(50): do_something_with(i). ¡¡Vamos, eso no está tan mal !!
jathanismo
@SilentGhost: Estoy dividiendo un diccionario de inglés para usarlo en una aplicación de Android. Debido a que el archivo individualmente es demasiado grande, escribí un script de Python para dividirlos en words_aa.txt, words_ab.txt, etc. Necesitaba escribir un segundo script para generar un archivo Java con una matriz que contenga los ID de los recursos de archivo sin procesar de cada archivo de Word (porque soy un vago), y no pude pensar en una mejor manera de hacerlo.
Tom R
3
parece que estás buscando algo como[''.join(i) for i in itertools.product(string.ascii_lowercase, repeat=2)]
SilentGhost
1
@SilentGhost: ¿Eso es todo lo que se necesita? Si tan solo dijera en el manual.
Tom R

Respuestas:

178

En Python 2.x, simplemente use las funciones ordy chr:

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

Python 3.x hace que esto sea más organizado e interesante, debido a su clara distinción entre bytes y Unicode. Por defecto, una "cadena" es Unicode, por lo que lo anterior funciona ( ordrecibe caracteres Unicode y los chrproduce).

Pero si está interesado en bytes (como para procesar algún flujo de datos binarios), las cosas son aún más 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
fuente
5
@Tom R. ¡No lo hagas! [Extraño los viejos tiempos]. A medida que intenta lograr algo rápidamente o convertir un fragmento de código, los conceptos y modismos de Python pueden parecer que simplemente impiden su progreso y difícilmente valen la pena la curva de aprendizaje ... ¡Sea paciente! Incluso puede descubrir que adquirir dominio en Python mejorará su estilo en Java (y C, en menor medida).
mjv
trabajado como un encanto. <br> El único cambio que haría es para z, en cuyo caso le he asignado una 'a'.
user45949
15

"ya es bastante malo no tener un bucleador tradicional para (;;)" ?? ¿Qué?

Estas tratando de hacer

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

¿O quizás estás usando string.uppercaseo string.letters?

Python no lo tiene for(;;)porque a menudo hay mejores formas de hacerlo. Tampoco tiene matemáticas de caracteres porque tampoco es necesario.

S.Lott
fuente
1
+1 por intentar responder la pregunta detrás de la pregunta (problema XY, etc.). Si pudiera, te daría más.
Devin Jeanpierre
Gracias. A menudo soy el primero en preguntar "¿por qué?" para preguntas como esta. Pero @SilentGhost se me adelantó.
S.Lott
3

Vengo de PHP, donde puedes incrementar char (A a B, Z a AA, AA a AB, etc.) usando el operador ++. Hice una función simple que hace lo mismo en Python. También puede cambiar la lista de caracteres a lo que necesite (minúsculas, mayú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
fuente
2

Hay una manera de aumentar el uso de caracteres ascii_lettersdel stringpaquete, que ascii_letterses una cadena que contiene todo el alfabeto inglés, mayúsculas y minúsculas:

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

También se puede hacer manualmente;

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

Marque esto: USANDO PARA LOOP

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

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

print(doubleChar("amar"))

salida:

aammaarr
Amar Tanwar
fuente