Obtener la posición del carácter en el alfabeto

5 minutos de lectura

avatar de usuario de qwerty
QWERTY

Estoy 90% seguro de que hay una función incorporada que hace esto.

Necesito encontrar la posición de un carácter en un alfabeto. Entonces el carácter “b” es la posición 1 (contando desde 0), etc. ¿Alguien sabe cómo se llama la función?

¡Gracias por adelantado!

EDITAR: lo que estoy tratando de hacer es enviar todos los caracteres X cantidad de “pasos” en la apuesta alfabética, por lo que si tengo una cadena con “hola”, sería “gh” si la enviara un paso atrás . Puede haber una mejor manera de hacerlo, ¿algún consejo?

Avatar de usuario de Senthil Kumaran
Senthil Kumaran

Se llama index. Por ejemplo

>>> import string
>>> string.lowercase.index('b')
1
>>> 

Nota: en Python 3, string.lowercase ha sido renombrado a string.ascii_lowercase.

  • ¡Gracias! ¿Hay alguna función inversa para eso, de modo que si tengo el índice de un carácter, puedo obtener el carácter real?

    – qwerty

    8 de mayo de 2011 a las 11:33

  • Sólo [] en la cadena o lista. >>>string.lowercase[2]

    – Senthil Kumaran

    8 de mayo de 2011 a las 11:34

  • Falló en el punto donde intentó indexar Y. No estará presente porque no es una minúscula. en vez de string.lowercase puedes probar string.ascii_letters

    – Senthil Kumaran

    8 de mayo de 2011 a las 12:12

  • tuve que usar print string.index(string.ascii_lowercase, "c")

    – Víctor S.

    25 de diciembre de 2011 a las 0:48

  • Pitón 3: string.ascii_lowercase.index( "R".lower() ) # --> 17

    – resolver

    2 de agosto de 2016 a las 11:52


Sin la importación

def char_position(letter):
    return ord(letter) - 97

def pos_to_char(pos):
    return chr(pos + 97)

  • ¿No es + o – 96?

    – Suraj Kothari

    5 de febrero de 2018 a las 18:33

Avatar de usuario de Peter Collingridge
Pedro Collingridge

Puede usar ord() para obtener la posición ASCII de un carácter y chr() para convertir una posición ASCII en un carácter.

EDITAR: Actualizado para ajustar el alfabeto, de modo que a-1 se asigna a z y z+1 se asigna a a

Por ejemplo:

my_string  = "zebra"
difference = -1
new_string = ''.join((chr(97+(ord(letter)-97+difference) % 26) for letter in my_string))

Esto creará una cadena con todos los caracteres movidos un espacio hacia atrás en el alfabeto (‘ydaqz’). Solo funcionará para palabras en minúsculas.

  • Impresionante, creo que este es el método que estaba tratando de recordar. ¡Esto está tan marcado!

    – qwerty

    8 de mayo de 2011 a las 12:03

  • Es posible que desee tener en cuenta que esto no repite az, y de manera similar para las variedades en mayúsculas. Suponiendo que qwerty apunta a algún tipo de algoritmo ROT, sería necesario arreglar esa parte superior con la ayuda de una operación de módulo (o dos).

    – Estigma

    8 de mayo de 2011 a las 12:07

  • Ese es un buen punto. También hará cosas raras con los espacios y la puntuación. Supongo que lo mismo es cierto para la respuesta aceptada.

    – Peter Collingridge

    8 mayo 2011 a las 22:01

  • Actualicé mi respuesta para envolver el alfabeto. Voy a suponer que la cadena se ha convertido a minúsculas primero.

    – Peter Collingridge

    8 mayo 2011 a las 22:36

# define an alphabet
alfa = "abcdefghijklmnopqrstuvwxyz"

# define reverse lookup dict
rdict = dict([ (x[1],x[0]) for x in enumerate(alfa) ])

print alfa[1] # should print b

print rdict["b"] # should print 1

rdict es un diccionario que se crea recorriendo el alfabeto, un carácter a la vez. La función enumerar devuelve una tupla con el índice de la lista y el carácter. Invertimos el orden creando una nueva tupla con este código: ( x[1], x[0]) y luego convertir la lista de tuplas en un diccionario. Dado que un diccionario es una estructura de datos de tabla hash (clave, valor), ahora podemos buscar el índice de cualquier carácter del alfabeto.

Sin embargo, eso no es lo que quiere resolver su problema, y ​​si se trata de una tarea de clase, probablemente obtendrá 0 por plagio si la envía. Para codificar las cadenas, primero cree un SEGUNDO alfabeto que esté organizado de modo que alfa2[n] es la forma codificada de alfa[n]. En su ejemplo, el segundo alfabeto se desplazaría dos caracteres, pero también podría mezclar los caracteres al azar o usar algún otro patrón para ordenarlos. Todo esto seguiría funcionando con otros alfabetos como el griego, el cirílico, etc.

Recién comencé a aprender Python, por lo que no tengo idea de cuán eficiente es esto en comparación con los otros métodos, pero funciona. Además, no importa si el texto está en mayúsculas, minúsculas o si hay algún signo de puntuación, etc.

Si desea cambiar todas las letras:

from string import maketrans

textin = "abcdefghijklmnopqrstuvwxyz"
textout = "cdefghijklmnopqrstuvwxyzab"
texttrans = maketrans(textin, textout)

text = "qcc, gr umpiq"

print text.translate(texttrans)

También funciona para cambiar algunos caracteres:

from string import maketrans

textin = "81972"
textout = "Seios"
texttrans = maketrans(textin, textout)

text = "811, 9t w7rk2"

print text.translate(texttrans)

Avatar de usuario de LJ Brown
LJ marrón

Aquí hay un método general que podría ser útil para alguien…

def alphabet(arg, return_lower=True):

    """
        Indexing the english alphabet consisting of 26 letters. 
        Note: zero indexed

            example usage:

                alphabet('a')
                >> 0

                alphabet(25, return_lower=False)
                >> 'Z'

        :param arg: Either type int or type chr specifying the \
                    index of desired letter or ther letter at \
                    the desired index respectivley.
        :param return_lower: If index is passes, returns letter \
                         with corresponding case. Default is \
                         set to True (lower case returned). 
        :returns: integer representing index of passed character \
                    or character at passed index.
    """

    arg = str(arg)
    assert arg.isdigit() or arg.isalpha()

    if arg.isdigit():
        if return_lower:
            return chr(int(arg) + 97).lower()  
        return chr(int(arg) + 97).upper()

    return ord(arg.lower()) - 97

avatar de usuario de gouzmi
gouzmi

Equivalente de la función COLUMNA en excel

def position(word):
    if len(word)>1:
        pos = 0
        for idx, letter in enumerate(word[::-1]):
            pos += (position(letter)+(1 if idx!=0 else 0))*26**(idx)
        return pos
    return ord(word.lower()) - 97


print(position("A")) --> 0
print(position("AA")) --> 26
print(position("AZ")) --> 51

  • Por favor, comparta una explicación detallada de sus respuestas.

    – sayalok

    6 de mayo a las 3:42

¿Ha sido útil esta solución?