>>> ids = [{"nonid": "-222", "id": 0}, {"id": -101}]
>>> min([val for obj in ids for key, val in obj.items() if key == 'id'])
-101
>>> ids = [{'id': 63}, { 'id': 42}]
>>> min([val for obj in ids for key, val in obj.items() if key == 'id'])
42
上記を試してください。
これを関数定義にすることができます:
def find_lowest(ids):
return min([val for obj in ids for key, val in obj.items() if key == 'id'])
実施例。
私が何をしているのか説明させてください。まず、min
関数は反復可能なオブジェクトを引数として受け取ります。それでは、デモンストレーションしましょう:
>>> min([1,2,3,4,6,1,0])
0
つまり、これが意味することは、基本的に、これから取得するリストの最小値を取得していること[val for obj in ids for key, val in obj.items() if key == 'id']
です。
さて、あなたは不思議に思うかもしれません、そこで何が起こっているのですか?最初は少し戸惑うかもしれませんが、これがリスト内包表記です。何て言う?簡単に言えば、リストを作成する簡潔な私たちです。
最初の部分から始めましょう。それはステートメントの始まりではありません。
for obj in ids
ここで行っているのは、 のすべての辞書オブジェクトを反復処理することですids
。ここで、そのオブジェクトを使用します。
key, val in obj.items() if key == 'id'
object は であるため、この関数dict
を使用してitems
、キーと値のペアのタプルを提供するジェネレーターを取得します。このようなオブジェクト{'id': 100}
では:id
がキーに100
なり、値になります。そのため、ディクショナリ オブジェクト内のすべての項目を調べて、たまたま が である場合は、それをリストに追加します。key
id
[val
それが最初の部分です。リスト内包表記の最初の部分は、最後のリストに何かval
を追加します。
アップデート:
何らかの理由で、リストにキーとして何も含まれていない場合、空のリストを受け入れないasid
がスローされるため、これを修正するには、次のことを確認できます。ValueError
min
def find_lowest(ids):
_ret = [val for obj in ids for key, val in obj.items() if key == 'id']
if _ret:
return min(_ret)
else:
return None