web-dev-qa-db-fra.com

Obtenir la position du personnage en alphabet

Je suis sûr à 90% qu'il existe une fonction intégrée qui le fait.

Je dois trouver la position d'un caractère dans un alphabet. Donc, le caractère "b" est la position 1 (en comptant à partir de 0), etc. Quelqu'un sait-il comment la fonction est appelée?

Merci d'avance!

EDIT: Ce que je tente de faire est d’envoyer tous les caractères X montant de "pas" dans le pari alpha, donc si j’ai une chaîne avec "salut" ce serait "gh" si je le renvoyais un pas . Il pourrait y avoir une meilleure façon de le faire, des conseils?

27
qwerty

Cela s'appelle index. Par exemple.

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

Remarque: en Python 3, string.lowercase a été renommé en string.ascii_lowercase.

50
Senthil Kumaran

Sans l'importation 

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

def pos_to_char(pos):
    return chr(pos + 97)
20
Jakob Bowyer

Vous pouvez utiliser ord () pour obtenir la position ASCII d'un personnage et chr () pour convertir une position ASCII en un caractère.

EDIT: mis à jour pour envelopper l’alphabet afin que a-1 mappe en z et z + 1 mappe en un

Par exemple:

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

Cela créera une chaîne avec tous les caractères déplacés d'un espace vers l'arrière dans l'alphabet ('ydaqz'). Cela ne fonctionnera que pour les mots en minuscules.

2
# 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 est un dictionnaire créé en parcourant l’alphabet, un caractère à la fois. La fonction enumerate renvoie un tuple avec l'index de la liste et le caractère. Nous inversons l'ordre en créant un nouveau tuple avec le code suivant: ( x[1], x[0]), puis transformons la liste des n-uplets en dictionnaire. Comme un dictionnaire est une structure de données de table de hachage (clé, valeur), nous pouvons maintenant rechercher l'index de n'importe quel caractère alphabétique.

Cependant, ce n'est pas ce que vous voulez résoudre votre problème, et s'il s'agit d'une tâche de classe, vous obtiendrez probablement 0 pour le plagiat si vous la soumettez. Pour encoder les chaînes, créez d’abord un SECOND alphabet organisé de manière à ce que alfa2 [n] soit la forme encodée d’alfa [n]. Dans votre exemple, le deuxième alphabet serait simplement décalé de deux caractères, mais vous pouvez également mélanger les caractères de manière aléatoire ou utiliser un autre modèle pour les classer. Tout cela continuerait à fonctionner avec d'autres alphabets tels que le grec, le cyrillique, etc.

0
Michael Dillon

Voici une méthode qui pourrait être utile pour quelqu'un ...

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
0
LJ Brown

Je viens tout juste de commencer à apprendre Python. Je ne sais donc pas à quel point cela est efficace par rapport aux autres méthodes, mais cela fonctionne. De plus, peu importe que le texte soit en majuscule, en minuscule ou s'il y a des signes de ponctuation, etc.

Si vous voulez changer toutes les lettres:

from string import maketrans

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

text = "qcc, gr umpiq"

print text.translate(texttrans)

Travaille également pour changer certains caractères:

from string import maketrans

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

text = "811, 9t w7rk2"

print text.translate(texttrans)
0
JamesCraig