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')
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.
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')