I have a list of dictionaries like so:
[{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]
I want to find the min() and max() prices. Now, I can sort this easily enough using a key with a lambda expression (as found in another Stack Overflow post), so if there is no other way I’m not stuck. However, from what I’ve seen there is almost always a direct way in Python, so this is an opportunity for me to learn a bit more.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
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'])
This tells you not just what the max price is but also which item is most expensive.
Method 2
There are several options. Here is a straight-forward one:
seq = [x['the_key'] for x in dict_list] min(seq) max(seq)
[Edit]
If you only wanted to iterate through the list once, you could try this (assuming the values could be represented as ints):
import sys
lo,hi = sys.maxint,-sys.maxint-1
for x in (item['the_key'] for item in dict_list):
lo,hi = min(x,lo),max(x,hi)
Method 3
I think the most direct (and most Pythonic) expression would be something like:
min_price = min(item['price'] for item in items)
This avoids the overhead of sorting the list — and, by using a generator expression, instead of a list comprehension — actually avoids creating any lists, as well. Efficient, direct, readable… Pythonic!
Method 4
One answer would be mapping your dicts to the value of interest inside a generator expression, and then applying the built-ins min and max.
myMax = max(d['price'] for d in myList) myMin = min(d['price'] for d in myList)
Method 5
can also use this:
from operator import itemgetter
lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]
max(map(itemgetter('price'), lst))
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0