Получить первые N пар ключей из упорядоченного словаря в другой - PullRequest
8 голосов
/ 27 ноября 2011

У меня есть упорядоченный словарь (OrderedDict), отсортированный по значению. Как я могу получить верхние (скажем, 25) ключевые значения и добавить их в новый словарь? Например: у меня есть что-то вроде этого:

dictionary={'a':10,'b':20,'c':30,'d':5}
ordered=OrderedDict(sorted(dictionary.items(), key=lambda x: x[1],reverse=True))

Теперь ordered - это упорядоченный словарь, я хочу создать словарь, скажем, взяв 2 наиболее часто встречающихся элемента и их ключи:

frequent={'c':30,'b':20}

Ответы [ 4 ]

15 голосов
/ 28 ноября 2011

Основной целью collections.OrderedDict является сохранение порядка, в котором элементы были вставлены .
То, что вы хотите здесь, это collections.Counter, который имеет n-наиболее частую встроенную функциональность:

>>> dictionary={'a':10,'b':20,'c':30,'d':5}
>>> import collections
>>> collections.Counter(dictionary).most_common(2)
[('c', 30), ('b', 20)]
5 голосов
/ 27 ноября 2011

Просто создайте новый словарь, используя первые N элементов (пар ключей) в (обратном) упорядоченном словаре, который у вас уже есть.Например, чтобы получить три верхних элемента, вы можете сделать что-то вроде этого:

from collections import OrderedDict
from operator import itemgetter

# create dictionary you have
dictionary = {'a': 10, 'b': 20, 'c': 30, 'd': 5}
ordered = OrderedDict(sorted(dictionary.items(), key=itemgetter(1), reverse=True))

topthree = dict(ordered.items()[:3])
print(topthree) # -> {'a': 10, 'c': 30, 'b': 20}

Для Python 3 можно использовать dict(list(ordered.items())[:3]), поскольку items() возвращает итератор в этой версии.В качестве альтернативы вы можете использовать dict(itertools.islice(ordered.items(), 3)), который будет работать как в Python 2, так и в 3.

Также обратите внимание, что результатом является просто обычный словарь - как вы указали в своем вопросе - не collections.Counter или другой тип отображения,Этот подход очень общий и не требует, чтобы исходный dictionary имел целочисленные значения - можно просто упорядочить вещи (т.е. сравнить с помощью функции key).

3 голосов
/ 27 ноября 2011

Пробовали ли вы индексировать список кортежей из отсортированных, чтобы получить первые и наиболее часто встречающиеся элементы и их ключи?Например, если вам нужны 2 самых популярных предмета, вы можете выполнить

dictionary={'a':10,'b':20,'c':30,'d':5}
ordered=dict(sorted(dictionary.items(), key=lambda x: x[1],reverse=True)[:2])
1 голос
/ 27 ноября 2011

Получить итератор элементов из метода ordered.iteritems().

Теперь, чтобы взять первые N элементов, вы можете использовать метод islice из itertools.

>>> import itertools
>>> toptwo = itertools.islice(ordered.iteritems(), 2)
>>> list(toptwo)
[('c', 30), ('b', 20)]
>>>
...