web-dev-qa-db-ja.com

List of Dictsで、共通のDictフィールドのmin()値を見つけます

次のような辞書のリストがあります。

[{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]

Min()およびmax()価格を見つけたい。今、私はラムダ式のキーを使用してこれを簡単にソートできます(別のSO記事で見られるように)。 Pythonにはほとんど常に直接的な方法があるのを見てきましたので、これは私にとってもう少し学ぶ機会です。

60
Hank Fay

いくつかのオプションがあります。これは簡単なものです:

seq = [x['the_key'] for x in dict_list]
min(seq)
max(seq)

[編集]

リストを1回だけ反復したい場合は、これを試すことができます(値が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)
48
dappawit
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'])

これは、最高価格が何であるかだけでなく、どの品目が最も高価であるかを示します。

173
Hugh Bothwell

最も直接的な(そして最もPython的な)式は次のようなものになると思います。

min_price = min(item['price'] for item in items)

これにより、リストをソートするオーバーヘッドが回避され、リスト内包表記の代わりにジェネレーター式を使用することで、実際にはリストの作成も回避されます。効率的、直接、読みやすい... Pythonic!

33
dcrosta

答えの1つは、ディクショナリをジェネレータ式内の目的の値にマッピングし、組み込みのminmaxを適用することです。

myMax = max(d['price'] for d in myList)
myMin = min(d['price'] for d in myList)
7
rlibby

これも使用できます:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
3
carton.swing