Использовать OrderedDict или упорядоченный список? (новичок)

(Используя Python 3.4.3) Вот что я хочу сделать: у меня есть словарь, где ключами являются строки, а значениями являются количество раз, когда эта строка встречается в файле. Мне нужно вывести, какие строки встречаются с наибольшей частотой, а также их частоты (если есть ничья для наиболее частых, выведите все наиболее частые).

Я пытался использовать OrderedDict. Я могу создать его нормально, но я изо всех сил пытаюсь заставить его выводить именно наиболее часто встречающиеся. Я могу продолжать попытки, но я не уверен, что OrderedDict действительно то, что мне следует использовать, поскольку мне никогда не понадобится фактический OrderedDict после того, как я определил и вывел наиболее частые строки и их частоту. Однокурсник порекомендовал упорядоченный список, но я не понимаю, как сохранить связь между ключами и значениями в том виде, в каком они у меня есть.

Является ли OrderedDict лучшим инструментом для выполнения того, что я ищу, или есть что-то еще? Если это так, есть ли способ отфильтровать/нарезать (или эквивалентно) OrderedDict?


person J.Smith    schedule 27.08.2015    source источник
comment
Нет, вы можете использовать обычный dict при сборе данных, затем вы помещаете данные (частота, пары ключей) в список и сортируете их.   -  person skyking    schedule 27.08.2015
comment
Похоже, вам нужен collections.Counter, а не .OrderedDict. Тогда вы можете просто использовать метод most_common.   -  person jonrsharpe    schedule 27.08.2015


Ответы (2)


Вы можете просто использовать sorted с соответствующей ключевой функцией, в этом случае вы можете использовать operator.itemgetter(1), которая будет сортировать ваши элементы на основе значений.

from operator import itemgetter

print sorted(my_dict.items(),key=itemgetter(1),reverse=True)
person kasravnd    schedule 27.08.2015

Это можно решить в два этапа. Сначала отсортируйте словарные статьи по их частоте, чтобы самая высокая частота была первой.

Во-вторых, используйте функцию Python groupby, чтобы получить совпадающие записи из списка. Поскольку вас интересует только наивысшее, вы останавливаетесь после одной итерации. Например:

from itertools import groupby
from operator import itemgetter

my_dict = {"a" : 8, "d" : 3, "c" : 8, "b" : 2, "e" : 2}

for k, g in groupby(sorted(my_dict.items(), key=itemgetter(1), reverse=True), key=itemgetter(1)):
    print list(g)
    break

Это будет отображать:

[('a', 8), ('c', 8)]

Так как a и c равны top.

Если вы удалите оператор break, вы получите полный список:

[('a', 8), ('c', 8)]
[('d', 3)]
[('b', 2), ('e', 2)]
person Martin Evans    schedule 27.08.2015