2015-08-27 1 views
0

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

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

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

+0

Нет, вы можете использовать обычный 'dict' во время сбора данных, то поместить данные (частоты, ключевые пары) в списке и сортирует его. – skyking

+2

Похоже, вы хотите 'collection.Counter', а не' .OrderedDict'. Тогда вы можете просто использовать метод 'most_common'. – jonrsharpe

ответ

1

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

from operator import itemgetter 

print sorted(my_dict.items(),key=itemgetter(1),reverse=True) 
0

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

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

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 равны сверху.

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

[('a', 8), ('c', 8)] 
[('d', 3)] 
[('b', 2), ('e', 2)] 
Смежные вопросы