Obtenga los primeros pares de teclas N de un Diccionario ordenado a otro

Tengo un diccionario ordenado ( OrderedDict ) ordenado por valor. ¿Cómo puedo obtener los valores clave superiores (por ejemplo, 25) y agregarlos a un nuevo diccionario? Por ejemplo: Tengo algo como esto:

 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, quiero crear un diccionario, por ejemplo, tomando los 2 elementos más frecuentes y sus claves:

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

El propósito principal de collections.OrderedDict es conservar el orden en que se insertaron los elementos.
Lo que desea aquí es collections.Counter . collections.Counter , que tiene la funcionalidad n más frecuente incorporada:

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

Simplemente cree un nuevo diccionario utilizando los primeros N elementos (pares de claves) en el diccionario ordenado (inverso) que ya tiene. Por ejemplo, para obtener los tres elementos principales, podría 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 usar dict(list(ordered.items())[:3]) ya que items() devuelve 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 regular, como especificó en su pregunta, no un collections.Counter u otro tipo de mapeo.

¿Ha intentado indexar la lista de tuplas del ordenado para obtener los primeros artículos más frecuentes y sus claves? Por ejemplo, si necesita los 2 elementos más frecuentes, puede hacerlo

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

Obtenga el iterador de los elementos del método ordered.iteritems() .

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

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