web-dev-qa-db-fra.com

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

Le code suivant imprime le mot dans le fichier txt et ensuite combien d'instances il y a 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 très 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')
17
user2101517

Il vous suffit de trier les articles. Le sorted intégré devrait fonctionner à merveille:

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

Si vous supprimez la ligne e.sort(), cela devrait s'exécuter dans approximativement le même laps de temps. La raison pour laquelle cela ne fonctionne pas est que les dictionnaires sont basés sur des tables hash qui stockent les éléments dans l'ordre de leurs valeurs de hachage (avec des choses plus compliquées lorsque des collisions de hachage se produisent). Étant donné que la fonction de hachage n'est jamais spécifiée nulle part, cela signifie que vous ne pouvez pas compter sur un dictionnaire qui conserve l'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 garde l'ordre d'insertion. cependant, cela ne vous aidera pas vraiment ici.

37
mgilson

Remarque Counter est une sous-classe de dict donc triez avant d'ajouter à Counter:

e.sort()
dic=Counter(e)

n'atteindra pas l'ordre.

import re
from collections import Counter

def print_Word_counts(filename):
    c = Counter()
    with open(filename) as f: # with block closes file at the end of the block
        for line in f: # go line by line, don't load it all into mem at once
            c.update(w.lower() for w in re.findall('[a-zA-Z]+', line))

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

print_Word_counts('engltreaty.txt')
0
jamylak