リスト内包表記を使って、リストから値を検索し取得する方法
list = [ {"id" : 1, "val": "ONE"}, {"id": 2, "val": "TWO"}]
リストから、id が 2 のものを取得したい場合
values = [x for x in list if x["id"] == 2]
value = values[0]
⇒ id=2が見つからない場合、IndexError: list index out of range
が発生する!
リストから、id が 2 のものが取得出来なかった場合の処理)
values = [x for x in list if x["id"] == 2]
value = values[0] if values else { "id": 0 , "val": "Default"}
もしくは
value = values[0] if values else None
ワンライナーで書くなら
value = [f for i in [[x for x in list if x["id"]== 2], [None]] for f in i][0]
解説
-
[x for x in list if x["id"]== 2]
の処理
[{"id": 2, "val": "TWO"}]
id=2が複数見つかる場合もあるため、配列
-
[[x for x in list if x["id"]== 2], [None]]
の処理
[
[{"id": 2, "val": "TWO"}],
[None]
]
2次元配列になる
-
[f for i in [[x for x in list if x["id"]== 2], [None]] for f in i]
の処理
分かりやすく書くと次のようになる
[flatten for inner in list for flatten in inner]
例えば次のようなリストlist = [[1, 3, 5], [2, 4]]
が合った場合
[
[1, 3, 5],
[2, 4]
]
for inner in list
は 以下の順番に取得し、innerに格納する
1: [1, 3, 5]
2: [2, 4]
for flatten in inner
はinnerの[1, 3, 5]
を以下のように取得しflattenに格納する
1 : 1
2: 3
3: 5
以下のような配列が出来上がる(2次元配列を1次元配列に変換している)
[1, 3, 5, 2, 4]
つまり、以下のような配列が出来上がる
[{"id": 2, "val": "TWO"}, None]
id=2が取得出来なかった場合、絶対に[None]
になるため、IndexError: list index out of range
になることはなくなる。
ラムダ式にした場合
flatten = lambda list: [flatten for inner in list for flatten in inner]
value = flatten([[x for x in list if x["id"]== 2], [None]])[0]