2011-11-27 14 views
5

Ho un dizionario ordinato (OrderedDict) ordinato per valore. Come posso ottenere i valori chiave migliori (diciamo 25) e aggiungerli a un nuovo dizionario? Per esempio: io ho qualcosa di simile:Ottieni le prime coppie di chiavi N da un dizionario ordinato a un altro

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

Ora ordered è un dizionario ordinato, voglio creare un dizionario, dice prendendo le prime 2 voci più-frequenti e le loro chiavi:

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

risposta

12

Lo scopo principale di OrderedDict è mantenere l'ordine in cui sono stati creati gli elementi. Quello che vuoi qui è collections.Counter, che ha la funzionalità di n-più-frequente built-in:

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

Grazie, questo è esattamente quello che volevo. –

+0

Grazie. Questo è stato molto utile! –

2

Hai provato a indicizzare l'elenco di tuple dall'ordinamento per ottenere l'ennesimo posto tra gli oggetti più frequenti e le loro chiavi? Per esempio, se avete bisogno i primi 2 elementi più frequenti, si potrebbe fare

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

Grazie, che funziona. :) –

1

Prendi l'iteratore degli elementi da ordered.iteritems() metodo.

Ora, per prendere i primi N elementi, è possibile utilizzare il metodo islice da itertools.

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

Basta creare un nuovo dizionario utilizzando i primi N elementi (coppie di chiavi) nel dizionario ordinato (inverso) già esistente. Ad esempio, per ottenere i primi tre elementi che si potrebbe fare qualcosa di simile:

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} 

Per Python 3 si potrebbe usare dict(list(ordered.items())[:3]) dal items() restituisce un iteratore in quella versione. In alternativa è possibile utilizzare dict(itertools.islice(ordered.items(), 3)) che funzionerebbe sia in Python 2 che in 3.

Inoltre, il risultato è solo un dizionario normale, come specificato nella domanda, non uno collections.Counter o un altro tipo di mapping.

Problemi correlati