Mam listę takich słowników:
[{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]
Chcę znaleźć ceny minimalne () i maksymalne (). Teraz mogę to łatwo posortować za pomocą klucza z wyrażeniem lambda (jak można znaleźć w innym artykule SO), więc jeśli nie ma innego sposobu, nie utknąłem. Jednak z tego, co widziałem, w Pythonie prawie zawsze jest bezpośrednia droga, więc jest to dla mnie okazja, aby dowiedzieć się trochę więcej.
seq
, a lista jest duża, może to być nieefektywne, ponieważ pamięć dla całej listy musi zostać przydzielona tylko po to, aby znaleźć maks.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'])
Dzięki temu dowiesz się nie tylko, jaka jest maksymalna cena, ale także, który przedmiot jest najdroższy.
źródło
Myślę, że najbardziej bezpośrednim (i najbardziej Pythonowym) wyrażeniem byłoby coś takiego:
min_price = min(item['price'] for item in items)
Dzięki temu unika się narzutu związanego z sortowaniem listy - i używając wyrażenia generatora zamiast wyrażenia listy - w rzeczywistości unika się również tworzenia jakichkolwiek list. Wydajne, bezpośrednie, czytelne ... Pythonic!
źródło
Jedną z odpowiedzi byłoby odwzorowanie twoich dykt na interesującą wartość wewnątrz wyrażenia generatora, a następnie zastosowanie wbudowanych funkcji
min
imax
.myMax = max(d['price'] for d in myList) myMin = min(d['price'] for d in myList)
źródło
[
i]
, i faktycznie generują listę Pythona jako krok pośredni.można również użyć tego:
from operator import itemgetter lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}] max(map(itemgetter('price'), lst))
źródło