ディクトのリストで、共通のディクトフィールドのmin()値を見つけます


90

私はそのような辞書のリストを持っています:

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

min()とmax()の価格を見つけたい。これで、ラムダ式のキーを使用してこれを簡単に並べ替えることができます(別のSOの記事にあります)。そのため、他に方法がない場合は、行き詰まりません。しかし、私が見たところ、Pythonにはほとんどの場合直接的な方法があるので、これは私がもう少し学ぶ機会です。

回答:


60

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

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)

これは答えを与えるだけでなく、シーケンスを抽象化できることも示したので、これを答えとして受け入れます。くそー、Pythonは美しい言語です。ありがとう!
ハンクフェイ2011年

2
が不要seqで、リストが大きい場合、最大値を見つけるためだけにリスト全体のメモリを割り当てる必要があるため、これは非効率的です。
Charles L.

スローAttributeError: module 'sys' has no attribute 'maxint'
サンキャッチャー

229
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'])

これにより、最高価格だけでなく、どのアイテムが最も高いかがわかります。


4
ああ、それはいい感じで、アイテム全体を返します。この場合は必要ありませんが、間違いなく将来のキーパーです。
ハンク・フェイ

それが私が探していたものです。驚くばかり。ありがとう!
svenwildermann 2014年

エレガントなソリューション!
anapaulagomes 2016年

2
@ thomas.mac並べ替えて、上位5つを選択できますか?stackoverflow.com/questions/72899/を

2
これは完全に機能します。@ thomas.macのコメントに続いて、いくつかある場合(たとえば、一致するdictのリストとして)、すべての最小値を取得する簡単な方法はありますか?
ロマン・

40

最も直接的な(そして最もPythonicな)表現は次のようになると思います:

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

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


8

一つの答えは、ジェネレータ式内側の関心の値にあなたのdictsをマッピングし、その後、ビルトインを適用することになるminmax

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

nitpick:これらはジェネレーター式です。リスト内包表記はとで囲まれ[]実際には中間ステップとしてPythonリストを生成します。
dcrosta 2011年

@dcrosta、はい、ありがとう、もちろんあなたは正しいです。恥ずかしかったので言い回しを変えました。
rlibby 2011年

3

これも使用できます:

from operator import itemgetter

lst = [{'price': 99, 'barcode': '2342355'}, {'price': 88, 'barcode': '2345566'}]  
max(map(itemgetter('price'), lst))
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.