2011-11-27 11 views
5

Tengo un diccionario ordenado (OrderedDict) ordenado por valor. ¿Cómo puedo obtener los valores de las teclas superiores (digamos 25) y agregarlas a un nuevo diccionario? Por ejemplo: Tengo algo como esto:Obtenga los primeros N pares de claves de un Diccionario ordenado a otro

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

Ahora ordered es un diccionario ordenado, yo quiero crear un diccionario, dicen tomando la parte superior 2 artículos más frecuentes y sus claves:

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

Respuesta

12

El objetivo principal de OrderedDict es mantener el orden en el que se crearon los elementos. Lo que se quiere aquí es collections.Counter, que tiene la funcionalidad N-más-frecuentes incorporada:

>>> dictionary={'a':10,'b':20,'c':30,'d':5} 
>>> import collections 
>>> collections.Counter(dictionary).most_common(2) 
[('c', 30), ('b', 20)] 
+0

Gracias, esto es exactamente lo que quería. –

+0

Gracias. ¡Esto fue muy útil! –

2

¿Ha intentado indexar la Lista de tuplas del ordenado para obtener los primeros enésimos artículos y sus claves? Por ejemplo, si necesita la parte superior 2 puntos más frecuentes, es posible hacer

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

Gracias, que funciona. :) –

1

Consigue el iterador de los artículos de ordered.iteritems() método.

Ahora, para tomar los primeros N elementos, puede usar el método islice de itertools.

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

Sólo hacer un nuevo diccionario utilizando los primeros N elementos (pares de claves) en el diccionario (inverso) ordenó que ya tiene. Por ejemplo, para obtener los tres principales elementos que podrían hacer algo como esto:

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} 

para Python 3 se podría utilizar dict(list(ordered.items())[:3]) desde items() un iterador en esa versión. Alternativamente, puede usar dict(itertools.islice(ordered.items(), 3)), que funcionaría tanto en Python 2 como en 3.

También tenga en cuenta que el resultado es solo un diccionario normal, como ha especificado en su pregunta, no un collections.Counter u otro tipo de asignación.

Cuestiones relacionadas