#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
Комментариев нет:
Отправить комментарий