#python #списки #словари
Здраствуйте. Есть готовый список, который содержит слова в определенной последовательности:
list = ['To', 'be', 'or', 'not', 'to', 'be']
Требуется подсчитать частоту появления слов в этом списке и составить словарь, который
содержит пары значений (слово) : (кол-во повторений этого слова).
Вот мой код:
# -*- coding: utf-8 -*-
list = ['To', 'be', 'or', 'not', 'to', 'be']
counts = dict()
for word in list:
if word not in counts: # Если символа нет в словаре, создаем новую запись
counts[word] = 1
else: # В противном случае инкрементируем d[c]
counts[word] += 1
print counts
Подсчет слов ведется правильно.
Проблема в том, что моя программа помещает новые записи в словарь в хаотичном порядке,
а не так, как слова шли в предложении. Вот что интерпретатор выдает на выходе:
{'not': 1, 'To': 1, 'or': 1, 'to': 1, 'be': 2}
А должно быть так:
{'To': 1, 'be': 2, 'or': 1, 'not': 1, 'to': 1}
Как можно получить такой результат? Никак не могу монять.
P.S.: В Python я новичок, поэтому не судите строго.
Ответы
Ответ 1
Вам нужен OrderedDict, Dict не поддерживает упорядочивание записей по умолчанию.Ответ 2
Словарь в Питоне не обязан сохранять порядок добавления слов. Хотя некоторые реализации Питона, такие как Pypy, используют упорядоченные словари по умолчанию. Чтобы подсчитать частоту появления слов во входном списке и напечатать их в том порядке как они заданы в списке, можно объединить Counter и OrderedDict, чтобы поддерживать порядок вставки: #!/usr/bin/env python from collections import Counter, OrderedDict class OrderedCounter(Counter, OrderedDict): pass input_list = ['To', 'be', 'or', 'not', 'to', 'be'] frequencies = OrderedCounter(input_list) for item, count in frequencies.items(): print("{}\t{}".format(item, count)) Результат To 1 be 2 or 1 not 1 to 1 Если достаточно только напечатать результат, то можно обойтись только Counter, без OrderedDict или сортировки: #!/usr/bin/env python from collections import Counter input_list = ['To', 'be', 'or', 'not', 'to', 'be'] frequencies = Counter(input_list) for item in input_list: count = frequencies.pop(item, None) if count is None: continue print("{}\t{}".format(item, count)) Результат совпадает с предыдущим кодом. frequencies словарь разрушается во время печати.Ответ 3
Вот один вариант как отсортировать: ссылкаОтвет 4
Если вам нужно просто отсортировать в алфавитном порядке, просто при выводе сделайте for key in sorted(counts.keys()): print '{0}: {1}'.format(key, counts[key]) А если именно в том порядке, в котором они встречались в первый раз - да, как писал Etki, используйте OrderedDict
Комментариев нет:
Отправить комментарий