Eu tenho uma lista de dicionários assim:
[{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]
Quero encontrar os preços mínimo () e máximo (). Agora, posso classificar isso com bastante facilidade usando uma chave com uma expressão lambda (conforme encontrada em outro artigo do SO), então, se não houver outra maneira, não estarei preso. No entanto, pelo que tenho visto, quase sempre existe uma maneira direta em Python, então esta é uma oportunidade para eu aprender um pouco mais.
seq
, e a lista for grande, isso pode ser ineficiente, pois a memória de toda a lista deve ser alocada apenas para encontrar o máximo.AttributeError: module 'sys' has no attribute 'maxint'
lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}] maxPricedItem = max(lst, key=lambda x:x['price']) minPricedItem = min(lst, key=lambda x:x['price'])
Isso informa não apenas qual é o preço máximo, mas também qual item é mais caro.
fonte
Acho que a expressão mais direta (e mais pitônica) seria algo como:
min_price = min(item['price'] for item in items)
Isso evita a sobrecarga de ordenar a lista - e, usando uma expressão geradora, em vez de uma compreensão de lista - na verdade evita a criação de listas também. Eficiente, direto, legível ... Pythônico!
fonte
Uma resposta seria mapear seus dictos para o valor de interesse dentro de uma expressão de gerador e, em seguida, aplicar os embutidos
min
emax
.myMax = max(d['price'] for d in myList) myMin = min(d['price'] for d in myList)
fonte
[
e e]
, na verdade, geram uma lista Python como uma etapa intermediária.também pode usar isto:
from operator import itemgetter lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}] max(map(itemgetter('price'), lst))
fonte