2015-05-30 29 views
6

Próbuję dostać indeks słowniku z max 'size' na liście słowników tak:Python lista dicts, uzyskać max wartość indeksu

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

z następującym kodem mogę wziąć maksymalny rozmiar:

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

Jak mogę teraz wziąć indeks? Czy istnieje łatwy sposób?

Test:

Właśnie wzorzysty mogę zrobić:

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

jest to prawidłowe?

Odpowiedz

11

Powiedz max() jak obliczyć maksimum dla sekwencji indeksów:

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

To będzie powrót indeksu do którego klucz size jest najwyższa:

>>> 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'} 

Jeśli chciał, że słownik przez cały czas, następnie można po prostu użyć:

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

i dostać zarówno indeks i słownika, można użyć enumerate() tutaj:

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

Niektóre bardziej demoing:

>>> 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'}) 

Funkcja key przepuszcza każdego elementu w sekwencji wejściowej kolei , a max() wybierze element, w którym zwracana wartość tej funkcji jest najwyższa.

Użycie osobnej listy do wyodrębnienia wszystkich wartości size, a następnie odwzorowanie, że powrót do pierwotnej listy nie jest zbyt wydajne (trzeba teraz dwukrotnie powtórzyć listę). list.index() nie może działać, ponieważ musi pasować do całego słownika, a nie tylko do jednej wartości.

+0

Dzięki za odpowiedz, dodałem pewne treści, co myślisz o? Potrzebuję łatwiejszego rozwiązania. Twoje jest niesamowite, ale łatwiejsze do zrozumienia byłoby miłe! – Kvash

+1

Wiele się uczę od twojej odpowiedzi. Dzięki za to. – Kvash

3

Można zdać enumerate(ld) do max funkcji z odpowiednim kluczem:

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