1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Python】リスト内包表記を使って、リストから値を検索し取得する方法

Last updated at Posted at 2019-07-26

リスト内包表記を使って、リストから値を検索し取得する方法

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]
1
2
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?