Вернуть вывод словаря в алфавитном порядке
Следующий код распечатывает слово в текстовом файле, а затем, сколько экземпляров этого слова (например, a, 26), проблема в том, что он не распечатывает его в алфавитном порядке. Любая помощь приветствуется
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')
2 ответа
Вам просто нужно отсортировать предметы. Встроенный sorted
должно работать чудесно:
for key,value in sorted(dic.items()):
...
Если вы бросите e.sort()
линия, то это должно выполняться примерно в то же время. Причина в том, что это не работает, потому что словари основаны на hash
таблицы, в которых хранятся элементы в порядке их хэш-значений (с некоторыми более сложными вещами, когда происходят хэш-конфликты). Поскольку функция хеширования нигде не указана, это означает, что вы не можете рассчитывать на то, что словарь хранит любой порядок, который вы пытаетесь дать, и что порядок зависит от реализации и версии. Для других простых случаев collections
модуль имеет OrderedDict
подкласс, который сохраняет порядок вставки. однако, это не очень поможет вам здесь.
Заметка Counter
это подкласс dict
так что сортировка, прежде чем добавить в Counter
:
e.sort()
dic=Counter(e)
не достигнет порядка.
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')