77 votes

Convertir les lettres de l'alphabet en chiffres en Python

Comment peut-on terminer ce qui suit ?

characters = ['a''b''c''d''e''f''g''h''i''j''k''l''m''n''o''p''q''r''t''u''v''w''x''y''z']
numbers = ['1''2''3''4''5''6''7''8''9''10''11''12''13''14''15''16''17''18''19''20''21''22''23''24']
text = raw_input(' Write text: ')

J'ai essayé de le résoudre de plusieurs façons, mais je n'ai pas pu atteindre la pinte. Je veux faire des exc. Si je tape "hello" la sortie doit être en chiffres alignés comme dans l'alphabet. Exemple a = 1 < dans l'alphabet.

3 votes

Qu'est-ce que vous avez jusqu'à présent, et en quoi ça ne marche pas ?

0 votes

Celui-ci fonctionne : pastebin.com/SYwgcpg8 mais quand j'augmente les chiffres, ça ne marche pas, je ne connais pas d'autres moyens :S

3 votes

Juste une remarque, il manque une lettre et deux chiffres dans votre liste... :P Vous devriez toujours essayer d'éviter de construire de longues listes comme celle-ci à la main. Il y a de meilleures façons de le faire :) (ex : import string ; letters = string.lowercase)

103voto

sberry Points 28742

Que diriez-vous de quelque chose comme ça :

print [ord(char) - 96 for char in raw_input('Write Text: ').lower()]

ord
compréhension de la liste
Codes de caractères ASCII

EDIT
Puisque vous m'avez demandé d'expliquer, je vais le faire... bien que cela ait déjà été expliqué assez bien dans les commentaires par [...].

Faisons cela sur plusieurs lignes pour commencer.

input = raw_input('Write Text: ')
input = input.lower()
output = []
for character in input:
    number = ord(character) - 96
    output.append(number)
print output

Ceci fait la même chose, mais est plus lisible. Assurez-vous que vous pouvez comprendre ce qui se passe ici avant d'essayer de comprendre ma première réponse. Tout ici est du Python simple et standard. La seule chose à noter est le ord ord signifie ordinal, et pratiquement tous les langages de haut niveau disposent de ce type de fonction. Elle vous donne une correspondance avec la représentation numérique de n'importe quel caractère. La fonction inverse de ord est appelée chr.

chr(ord('x')) == 'x' # for any character, not just x.

Si vous testez par vous-même, l'ordinal de a est 97 (le troisième lien que j'ai posté ci-dessus montre le jeu de caractères ASCII complet.) Chaque lettre minuscule est comprise entre 97 et 122 (26 caractères). Donc, si vous soustrayez 96 de l'ordinal de n'importe quelle lettre minuscule, vous obtiendrez sa position dans l'alphabet en supposant que vous prenez 'a' == 1. Ainsi, l'ordinal de 'b' == 98, 'c' == 99, etc. Lorsque vous soustrayez 96, 'b' == 2, 'c' == 3, etc.

Le reste de la solution initiale que j'ai postée est juste une astuce Python que vous pouvez apprendre et qui s'appelle la compréhension de liste. Mais je ne m'y intéresserais pas autant que je me concentrerais sur l'apprentissage de la résolution du problème en tout langue, où l'ordre est votre ami. J'espère que cela vous aidera.

2 votes

Wow ça a marché parfaitement merci... Je suis désolé si je vous dérange mais je vous serais reconnaissant si vous pouviez m'expliquer le code :)

0 votes

@altin : ord() renvoie l'ordinal entier d'une chaîne de caractères. Ainsi, ord('A') retournera 97, la valeur ASCII pour A . Le site [] est une compréhension de liste. Ça veut dire, obtenir la ord du caractère que vous avez entré via raw_input et le convertir en minuscules en utilisant .lower() et en soustraire 96. Ceci est fait pour obtenir le résultat que vous souhaitez.

0 votes

Je ne sais pas si c'est censé être un problème, mais toute ponctuation va donner des valeurs négatives. Je serais tenté d'ajouter "if char.isalpha()" à votre liste de compréhension.

45voto

Statham Points 1642

Vous pouvez utiliser chr() et ord() pour convertir des lettres en nombres entiers.

Voici un exemple simple.

>>> chr(97)
'a'
>>> ord('a')
97

6 votes

Les réponses uniquement sous forme de code sont très rarement utiles. Veuillez expliquer en quoi cela répond à la question. Merci.

5 votes

Je ne suis pas d'accord, je fais généralement défiler la page jusqu'à ce que je trouve un code de réponse clair et court à copier et coller, tout en évitant de lire de longues explications.

0 votes

Pour Pandas Je devais le faire : df['number_col'] = df['number_col'].astype(int).apply(lambda x: chr(ord('`')+x))

13voto

dawg Points 26051

Je ne veux pas être trop basique, mais ça :

>>> char1 = ['a''b''c''d''e''f''g''h''i''j''k''l'
             'm''n''o''p''q''r''s''t''u''v''w''x''y''z']

est très différente de celle-ci :

>>> char2 = ['a','b','c','d','e','f','g','h','i','j','k','l',
               'm','n','o','p','q','r','s','t','u','v','w','x','y','z']

La première, sans virgule et ce que vous avez dans votre question, est une liste d'un élément avec une chaîne de 26 éléments. La seconde est une liste de 26 éléments, chacun d'entre eux étant composé d'un seul caractère.

Si vous imprimez chaque :

>>> print char1, len(char1), len(char1[0])
['abcdefghijklmnopqrstuvwxyz'] 1 26
>>> print char2, len(char2), len(char2[0])
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 
'm', 'n', 'o', 'p', 'q','r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'] 26 1

Il devient évident qu'il faut une étape supplémentaire pour transformer les personnages individuels de char1 dans un itérable .

Si vous avez le séquence de caractères 'a' à 'z' et/ou 'A' à 'Z', vous pouvez facilement retourner le numéro du caractère avec compréhension de la liste :

>>> [ord(x)%32 for x in char2]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

Pour le type de structure de données que vous avez, vous devez d'abord accéder à la chaîne de caractères :

>>> [ord(x)%32 for x in char1[0]]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 
17, 18, 19, 20, 21, 22, 23, 24, 25, 26]

Donc, si votre liste de codes est la même que dans votre question, cela peut être votre problème.

Une alternative raisonnable est : [ord(x.lower())-96 for x in char1[0]]

Vous pouvez voir que votre characters=['a''b''c'...] sans les virgules, c'est la même chose que de taper tous les caractères d'une chaîne de caractères dans une liste comme ceci ['abc...'] .

Alors maintenant, essayez :

 >>> import string
 >>> [ord(x.lower())-96 for x in string.letters]
 [1,2,...26, 1,2,3...26]      # my ellipses 
 >>> char3=[string.letters]   # one string as element[0]
 >>> [ord(x)%32 for x in char3[0]]
 >>> [ord(x)%32 for x in [string.letters][0]]

9voto

the wolf Points 10164

Si vous avez l'intention d'utiliser souvent cette conversion, envisagez de faire le calcul une fois et de placer les résultats dans un dictionnaire :

>>> import string
>>> di=dict(zip(string.letters,[ord(c)%32 for c in string.letters]))
>>> di['c'] 
3

L'avantage est que les consultations de dictionnaires sont très rapides par rapport à l'itération d'une liste à chaque appel.

>>> for c in sorted(di.keys()):
>>>    print "{0}:{1}  ".format(c, di[c])
# what you would expect....

6voto

parent5446 Points 626

Voici une fonction que j'utilisais à cette fin. Elle fonctionne aussi bien pour les majuscules que pour les minuscules.

def convert_char(old):
    if len(old) != 1:
        return 0
    new = ord(old)
    if 65 <= new <= 90:
        # Upper case letter
        return new - 64
    elif 97 <= new <= 122:
        # Lower case letter
        return new - 96
    # Unrecognized character
    return 0

1 votes

Puisque vous apportez tout le monde (majuscules et minuscules) aux nombres, je préférerais convertir votre "ancien" en minuscules plutôt que de faire 2 cas séparés (if et elif). +1 :)

0 votes

Existe-t-il un raw_input('text : ') ?

0 votes

Oui, @Morlock a raison. Ce code est assez vieux et je ne pense pas l'avoir entièrement écrit (je l'ai juste copié et collé depuis la source). @sberry2A pourrait en fait avoir la meilleure solution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X