2010-11-06 6 views

Répondre

7
>>> from string import lowercase 
>>> dict((j,i) for i,j in enumerate(lowercase, 1)) 
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26} 

enumerate(lowercase) renvoie cette séquence (0, 'a'), (1, 'b'), (2, 'c'),...

en ajoutant le paramètre facultatif, énumérer commence à 1 au lieu de 0

enumerate(lowercase, 1) renvoie cette séquence (1, 'a'), (2, 'b'), (3, 'c'),...

Le paramètre optionnel ne sont pas pris en charge par python plus ancien que 2.6, donc vous pouvez l'écrire de cette façon à la place

>>> dict((j,i+1) for i,j in enumerate(lowercase)) 
+0

Merci, c'est bon. Pouvez-vous expliquer la partie énumérer? – user225312

+2

+1 pour énumérer (minuscules) - bien que le support ', 1' nécessite 2.6 –

+0

Je comprends. Je vous remercie. – user225312

0

Devine que je n'ai pas suffisamment traité la question. Correction

dict((chr(x), x-ord('a') +1) for x in range(ord('a'), ord('z')+1)) 
+0

Ceci renvoie les codes ASCII et non le dictionnaire comme demandé. La sortie est: '{'a': 97, 'c': 99, 'b': 98,' – user225312

+0

erreur de syntaxe, aussi mappe 'a': 97, pas 1 –

+1

enumerate serait de prendre en compte le laid -ord ('a') + 1' – bukzor

0

Vous êtes sur la bonne voie, mais il faut noter que zip nécessite une séquence.

Donc, c'est ce que vous avez besoin:

alphabets = dict(zip([chr(x) for x in range(ord('a'), ord('z')+1)], range(1, 27))) 

ord renvoie le ordinale entier d'une chaîne de caractères. Donc, vous ne pouvez pas faire un chr(sequence) ou un ord(sequence). Ce doit être un seul caractère ou un seul nombre.

+0

Ok je vois où j'avais tort – user225312

0

Je ne suis pas sûr d'une implémentation exacte, mais cela ne serait-il pas logique d'utiliser les codes ASCII à votre avantage, car ils sont dans l'ordre? Spécifiez le début et la fin, puis bouclez-les en ajoutant le caractère ASCII et le code ASCII moins le point de départ.

1
dict((chr(x + 96), x) for x in range(1, 27)) 
0

compréhension du dictionnaire:

{chr(a + 96):a for a in range(1,27)} 

>>> {chr(a + 96):a for a in range(1,27)} 
{'a': 1, 'c': 3, 'b': 2, 'e': 5, 'd': 4, 'g': 7, 'f': 6, 'i': 9, 'h': 8, 'k': 11, 'j': 10, 'm': 13, 'l': 12, 'o': 15, 'n': 14, 'q': 17, 'p': 16, 's': 19, 'r': 18, 'u': 21, 't': 20, 'w': 23, 'v': 22, 'y': 25, 'x': 24, 'z': 26} 

cela ne fonctionne que dans les versions de python qui prennent en charge compréhensions dictionnaire, par exemple 3.x et je pense 2.7

0

Une recherche de dictionnaire est-elle vraiment ce que vous voulez? Vous pouvez tout simplement avoir une fonction qui fait cela:

def getNum(ch): 
    return ord(ch) - ord('a') + 1 

Ceci est assez simple en mathématiques, il est peut-être plus efficace qu'une recherche de dictionnaire, car la chaîne n'a pas besoin d'être haché et comparé. Pour effectuer une recherche dans un dictionnaire, la clé que vous recherchez doit être hachée, puis elle doit trouver où se trouve ce hachage dans le dictionnaire. Ensuite, il doit comparer la clé à la clé trouvée pour déterminer si elle est la même ou s'il s'agit d'une collision de hachage. Ensuite, il doit lire la valeur à cet endroit.

La fonction n'a besoin que de quelques ajouts.Il a cependant la surcharge d'un appel de fonction, ce qui peut le rendre moins efficace qu'une recherche de dictionnaire.

Une autre chose que vous devez prendre en compte est ce que chaque solution fait si l'entrée est invalide (pas 'a' - 'z', par exemple majuscule 'A'). La solution de dictionnaire soulèverait une KeyError. Vous pourriez ajouter du code pour attraper les erreurs si vous utilisiez une fonction. Si vous utilisiez 'A' avec la solution in-situ, vous obtiendriez un résultat erroné, mais aucune erreur ne serait déclenchée indiquant que votre entrée était invalide. Le point est qu'en plus de demander "Quel serait un moyen efficace de mettre en œuvre cette expression?", Vous devriez aussi demander (au moins vous demander) est "Est-ce vraiment cette expression que je veux?" et "Est-ce que le plus d'efficacité vaut les compromis?".

Questions connexes