2010-01-28 13 views
72

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

¿Cómo puedo hacer esto en Python? Ya es bastante malo no tener un looper tradicional (;;). ¿Hay alguna manera de lograr lo que quiero lograr sin tener que replantear toda mi estrategia?

Cualquier ayuda apreciada.

+5

puedo preguntar, ¿por qué tendrías que hacer esto? – SilentGhost

+1

Bucle 'for 'tradicional:' para i en rango (50): do_something_with (i) '. Vamos, ¡eso no es tan malo! – jathanism

+0

@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 un array que contenga el Ids de los recursos de archivo sin procesar de cada archivo de palabras (porque soy flojo), y no se me ocurrió una mejor manera de hacerlo. –

Respuesta

137

En Python 2.x, sólo tiene que utilizar los ord y chr funciones:

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

Python 3.x hace que este más organizado e interesante, debido a su clara distinción entre bytes y Unicode. De forma predeterminada, una "cadena" es unicode, por lo que lo anterior funciona (ord recibe caracteres Unicode y chr los produce).

Pero si usted está interesado en bytes (por ejemplo, para el procesamiento de algunos flujo de datos binarios), las cosas son aún más simple:

>>> bstr = b'abc' 
>>> bstr[0] 
97 
>>> bytes([97, 98, 99]) 
b'abc' 
>>> bytes([bstr[0] + 1, 98, 99]) 
b'bbc' 
+2

¡Muy rápido! Gracias. Sin embargo, me hace extrañar "los buenos viejos tiempos". –

+7

Los buenos viejos tiempos donde todo era demasiado difícil? ¡Bah! – jathanism

+5

@Tom R. ¡No! [Extraño los viejos tiempos]. A medida que intentas lograr algo rápidamente o convertir un fragmento de código, los conceptos y expresiones idiomáticas de Python pueden simplemente impedir tu progreso y apenas valdrán la curva de aprendizaje ... ¡Sé paciente! Incluso puede descubrir que obtener dominio de Python mejorará su estilo en Java (y C, en menor medida). – mjv

12

"bastante malo no tener un tradicional para (;;) looper"? ? ¿Qué?

¿Estás tratando de hacer

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

O tal vez usted está utilizando string.uppercase o string.letters?

Python no tiene for(;;) porque a menudo hay mejores formas de hacerlo. Tampoco tiene carácter matemático porque tampoco es necesario.

+1

+1 por tratar de responder la pregunta detrás de la pregunta (problema XY, etc.).Si pudiera, te daría más. –

+0

Gracias. A menudo soy el primero en preguntar "¿por qué?" para preguntas como esta. Pero @SilentGhost me ganó. –

0

Vengo de PHP, donde puede incrementar el carácter (A a B, Z a AA, AA a AB, etc.) utilizando 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 
Cuestiones relacionadas