Entrambe le risposte sono state buone, e Greg era a destra, la risposta di Raymond è più di alto livello e più facile da implementare, ma ho costruito la risposta di Greg perché era più facile da manipolare per soddisfare le mie necessità.
Nel caso qualcuno stia cercando un modo per trovare i valori più vicini da un elenco di dict.
mio dict assomiglia a questo, in cui NPI è solo un identificatore che ho bisogno insieme al valore:
mydict = {u'fnpi': u'1982650024',
u'snpi': {u'npi': u'1932190360', u'value': 2672},
u'snpis': [{u'npi': u'1831289255', u'value': 20},
{u'npi': u'1831139799', u'value': 20},
{u'npi': u'1386686137', u'value': 37},
{u'npi': u'1457355257', u'value': 45},
{u'npi': u'1427043645', u'value': 53},
{u'npi': u'1477548675', u'value': 53},
{u'npi': u'1851351514', u'value': 57},
{u'npi': u'1366446171', u'value': 60},
{u'npi': u'1568460640', u'value': 75},
{u'npi': u'1326046673', u'value': 109},
{u'npi': u'1548281124', u'value': 196},
{u'npi': u'1912989989', u'value': 232},
{u'npi': u'1336147685', u'value': 284},
{u'npi': u'1801894142', u'value': 497},
{u'npi': u'1538182779', u'value': 995},
{u'npi': u'1932190360', u'value': 2672},
{u'npi': u'1114020336', u'value': 3264}]}
value = mydict['snpi']['value'] #value i'm working with below
npi = mydict['snpi']['npi'] #npi (identifier) i'm working with below
snpis = mydict['snpis'] #dict i'm working with below
per ottenere un [id, value]
lista (non solo un elenco di valori), io uso questo:
[[id,val] for diff, val, id in sorted((abs(x['value']-value), x['value'], x['npi']) for x in snpis)[:6]]
che produce questo:
[[u'1932190360', 2672],
[u'1114020336', 3264],
[u'1538182779', 995],
[u'1801894142', 497],
[u'1336147685', 284],
[u'1912989989', 232]]
EDIT
In realtà ho trovato molto semplice anche manipolare la risposta di Raymond, se si tratta di un ditt (o un elenco di elenchi).
from heapq import nsmallest
[[i['npi'], i['value']] for i in nsmallest(6, snpis, key=lambda x: abs(x['value']-value))]
Questo produrrà lo stesso dell'uscita di cui sopra.
E questo
nsmallest(6, snpis, key=lambda x: abs(x['value']-value))
produrrà invece un dict.
Quindi, perché la documentazione dice: "Le ultime due funzioni funzionano meglio per valori minori di n. Per valori maggiori, è più efficiente usare la funzione' ordinata() '"? Per me equivale a dire che 'nsmallest' è peggio di O (nlogn) in complessità asintotica, ma sembra essere più efficiente per un intervallo di' n's piccoli. O l'algoritmo non è efficiente come lo dichiari, o la documentazione è in qualche modo sbagliata. – Bakuriu
@Bakuriu: 'nsmallest()' ha una complessità temporale di O (_n_ log _k_), dove _n_ è la dimensione del contenitore e _k_ è il numero di valori più piccoli che stai cercando. La complessità di 'sorted()' è O (_n_ log _n_), ma ha un fattore costante migliore. Quindi se _k/n_ è piccolo rispetto a 1, 'nsmallest()' vincerà. Se _k_ diventa più grande rispetto a _n_, ad un certo punto 'sorted()' vincerà a causa della costante migliore. Né Raymond né la documentazione sono sbagliati, anche se la documentazione potrebbe essere più chiara sul fatto che "più piccolo" in realtà significa più piccolo rispetto alla dimensione della collezione. –
@SvenMarnach: è possibile anche la selezione del tempo lineare, che la documentazione trascura. –