2015-05-30 8 views
6

sto cercando di ottenere l'indice del dizionario con la massima 'size' in un elenco di dizionari come la seguente:Python elenco di dicts, ottenere il valore massimo dell'indice

ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}] 

con il seguente codice posso prendere la dimensione massima:

items = [x['size'] for x in ld] 
print max(items) 

Come posso prendere il suo indice ora? C'è un modo semplice?

prova:

Ho solo pensato posso farlo:

items = [x['size'] for x in ld] 
max_val = max(items) 
print items.index(max_val) 

è corretto?

risposta

11

max() come calcolare il massimo per una sequenza di indici:

max(xrange(len(ld)), key=lambda index: ld[index]['size']) 

Questa tornerà l'indice per il quale la chiave size è il più alto:

>>> ld = [{'prop': 'foo', 'size': 100}, {'prop': 'boo', 'size': 200}] 
>>> max(xrange(len(ld)), key=lambda index: ld[index]['size']) 
1 
>>> ld[1] 
{'size': 200, 'prop': 'boo'} 

Se si voleva che dizionario da sempre, quindi è sufficiente utilizzare:

max(ld, key=lambda d: d['size']) 

e per ottenere sia l'indice e il dizionario, è possibile utilizzare enumerate() qui:

max(enumerate(ld), key=lambda item: item[1]['size']) 

Alcuni più provare le canzoni:

>>> max(ld, key=lambda d: d['size']) 
{'size': 200, 'prop': 'boo'} 
>>> max(enumerate(ld), key=lambda item: item[1]['size']) 
(1, {'size': 200, 'prop': 'boo'}) 

La funzione key è passato ogni elemento della sequenza di input, a sua volta e max() sceglierà l'elemento in cui il valore restituito della funzione key è più alto.

Utilizzare un elenco separato per estrarre tutti i valori size, quindi mappare nuovamente l'elenco originale non è molto efficiente (è necessario ripetere l'elenco due volte). list.index() non può funzionare in quanto deve corrispondere all'intero dizionario, non solo un valore in esso.

+0

Grazie per si risponde, ho aggiunto alcuni contenuti, che cosa ne pensi? Ho bisogno di una soluzione più semplice. Il tuo è fantastico ma più facile da capire sarebbe bello! – Kvash

+1

Sto imparando molto dalla tua risposta. Grazie per questo. – Kvash

3

È possibile passare la funzione enumerate(ld)-max con una chiave corretta:

>>> max(enumerate(ld),key=lambda (x,y):y['size'])[0] 
1 
Problemi correlati