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?
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 destring.lowercase
puedes probarstring.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
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)
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
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