19 votes

Renvoyer la sortie du dictionnaire à l'ordre alphabétique

Le code suivant imprime le mot dans le fichier txt suivi du nombre d'occurrences de ce mot (par exemple, a, 26). Le problème est qu'il ne l'imprime pas dans l'ordre alphabétique. Toute aide serait grandement appréciée

import re
def print_word_counts(filename):
    s=open(filename).read()
    words=re.findall('[a-zA-Z]+', s)
    e=[x.lower() for x in (words)]
    e.sort()
    from collections import Counter
    dic=Counter(e)
    for key,value in dic.items():
        print (key,value)
print_word_counts('engltreaty.txt')

43voto

mgilson Points 92954

Vous avez juste besoin de trier les éléments. Le sorted intégré devrait fonctionner à merveille :

for key,value in sorted(dic.items()):
    ...

Si vous supprimez la ligne e.sort(), alors cela devrait s'exécuter en environ le même temps. La raison pour laquelle cela ne fonctionne pas est que les dictionnaires sont basés sur des tables de hachage qui stockent les éléments dans l'ordre de leurs valeurs de hachage (avec des choses plus compliquées qui se produisent en cas de collisions de hachage). Comme la fonction de hachage n'est jamais spécifiée nulle part, cela signifie que vous ne pouvez pas compter sur un dictionnaire gardant un ordre que vous essayez de lui donner et que l'ordre dépend de l'implémentation et de la version. Pour d'autres cas simples, le module collections a une sous-classe OrderedDict qui conserve l'ordre d'insertion. Cependant, cela ne vous aidera pas vraiment ici.

0voto

jamylak Points 38094

Note Counter est une sous-classe de dict donc trier avant d'ajouter à Counter:

e.sort()
dic=Counter(e)

ne permettra pas d'obtenir de l'ordre.

import re
from collections import Counter

def print_word_counts(filename):
    c = Counter()
    with open(filename) as f: # le bloc with ferme le fichier à la fin du bloc
        for line in f: # parcourir ligne par ligne, ne pas tout charger en mémoire en une seule fois
            c.update(w.lower() for w in re.findall('[a-zA-Z]+', line))

    for k, v in sorted(c.items()): # trie
        print k, v

print_word_counts('engltreaty.txt')

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