Страницы

Поиск по вопросам

вторник, 31 декабря 2019 г.

Последовательное чтение значений из списка в словарь

#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

Комментариев нет:

Отправить комментарий