2
3

More than 1 year has passed since last update.

[Python] リストの内容をフィルターして新たなリストを作る時の Tips (リスト内包表記)

Last updated at Posted at 2022-05-18

備忘録として。
掲題のケースですっきり書けるやり方をメモしておく。
( 他に良い方法があればご指摘いただけますと幸いです )

確認環境

少し古いが下記の環境で確認。

バージョン 確認方法
python3 v3.7.12 python3 -V

単純なリストの場合

単一の条件にマッチ

hoge_list = [1,2,3,4,5,6,7,8,9,10]

# hoge_list の値が 5 のものを抽出して新しいリストを作る
filtered_hoge_list = [ hoge for hoge in hoge_list if hoge == 5]

# 出力して確認
# 条件に指定した値がリストの要素になっていることが確認できる
filtered_hoge_list
[5]

複数の条件にマッチ

hoge_list = [1,2,3,4,5,6,7,8,9,10]

# hoge_list の値が [5, 6, 7] のものを抽出して新しいリストを作る
filtered_hoge_list = [ hoge for hoge in hoge_list if hoge in (5,6,7)]

# 出力して確認
# 条件に指定した値がリストの要素になっていることが確認できる
filtered_hoge_list
[5, 6, 7]

dictionary をリストにしている場合

単一の条件にマッチ

foo_dict_list = [
    { 'id': 1, 'summary': 'aaaaaaaa' },
    { 'id': 2, 'summary': 'bbbbbbbb' },
    { 'id': 3, 'summary': 'cccccccc' },
    { 'id': 4, 'summary': '44444444' },
    { 'id': 5, 'summary': 'eeeeeeee' }
]

# foo_dict_list の id が 4 のものを抽出して新しいリストを作る
filtered_foo_dict_list = [foo for foo in foo_dict_list if foo['id'] == 4]

# 出力して確認
# 条件に指定した値がリストの要素になっていることが確認できる
filtered_foo_dict_list
[{'id': 4, 'summary': '44444444'}]

複数の条件にマッチ

foo_dict_list = [
    { 'id': 1, 'summary': 'aaaaaaaa' },
    { 'id': 2, 'summary': 'bbbbbbbb' },
    { 'id': 3, 'summary': 'cccccccc' },
    { 'id': 4, 'summary': '44444444' },
    { 'id': 5, 'summary': 'eeeeeeee' }
]

# foo_dict_list の id が [1,2,3] のものを抽出して新しいリストを作る
filtered_foo_dict_list = [foo for foo in foo_dict_list if foo['id'] in (1,2,3)]

# 出力して確認
# 条件に指定した値がリストの要素になっていることが確認できる
filtered_foo_dict_list
[{'id': 1, 'summary': 'aaaaaaaa'}, {'id': 2, 'summary': 'bbbbbbbb'}, {'id': 3, 'summary': 'cccccccc'}]

他のやり方

@shiracamus 様から コメント で filter 関数を使った方法についてご提示頂きました。

単純なリストの場合

単一の条件にマッチ

hoge_list = [1,2,3,4,5,6,7,8,9,10]

# パターン-1
filtered_hoge_list = [*filter(5 .__eq__, hoge_list)]

# 出力して確認
# 条件に指定した値がリストの要素になっていることが確認できる
filtered_hoge_list
[5]

# パターン2, こちらは lambda 関数と併用してフィルタリング
filtered_hoge_list = [*filter(lambda hoge: hoge == 5, hoge_list)]

# 出力して確認
# 条件に指定した値がリストの要素になっていることが確認できる
filtered_hoge_list
[5]

複数の条件にマッチ

hoge_list = [1,2,3,4,5,6,7,8,9,10]

# パターン-1
filtered_hoge_list = [*filter((5,6,7).__contains__, hoge_list)]

# 出力して確認
# 条件に指定した値がリストの要素になっていることが確認できる
filtered_hoge_list
[5, 6, 7]

# パターン2, こちらは lambda 関数と併用してフィルタリング
filtered_hoge_list = [*filter(lambda hoge: hoge in (5,6,7), hoge_list)]

# 出力して確認
# 条件に指定した値がリストの要素になっていることが確認できる
filtered_hoge_list
[5, 6, 7]

dictionary をリストにしている場合

単一の条件にマッチ

foo_dict_list = [
    { 'id': 1, 'summary': 'aaaaaaaa' },
    { 'id': 2, 'summary': 'bbbbbbbb' },
    { 'id': 3, 'summary': 'cccccccc' },
    { 'id': 4, 'summary': '44444444' },
    { 'id': 5, 'summary': 'eeeeeeee' }
]

# lambda 関数と併用してフィルタリング
filtered_foo_dict_list = [*filter(lambda foo: foo["id"] == 4, foo_dict_list)]

# 出力して確認
# 条件に指定した値がリストの要素になっていることが確認できる
filtered_foo_dict_list
[{'id': 4, 'summary': '44444444'}]

複数の条件にマッチ

foo_dict_list = [
    { 'id': 1, 'summary': 'aaaaaaaa' },
    { 'id': 2, 'summary': 'bbbbbbbb' },
    { 'id': 3, 'summary': 'cccccccc' },
    { 'id': 4, 'summary': '44444444' },
    { 'id': 5, 'summary': 'eeeeeeee' }
]

# lambda 関数と併用してフィルタリング
filtered_foo_dict_list = [*filter(lambda foo: foo["id"] in (1,2,3), foo_dict_list)]

# 出力して確認
# 条件に指定した値がリストの要素になっていることが確認できる
filtered_foo_dict_list
[{'id': 1, 'summary': 'aaaaaaaa'}, {'id': 2, 'summary': 'bbbbbbbb'}, {'id': 3, 'summary': 'cccccccc'}]
2
3
4

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
2
3