ブルーの趣味Log

日々の備忘録

【Python】内包表記を用いたリスト内検索

内包表記とは?

これはおそらくPython独特の表記だと思われます。

具体的には、以下のようにfor文を使用して書く場合に、

extension_1 = []
for i in range(10):
    extension_1.append(i)
extension_1
#>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

内包表記を利用すると一文で書けてしまいます。

comprehension_1= [i for i in range(10)]
comprehension_1
#>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

【参考】
qiita.com

正直なところ、私もあまり詳しくないため、興味のある方は上記参考ページ等をみてください。

やりたいこと

さて、ここからが本題です。
Pythonでリストを作成しそのリスト内に、ある要素があるのかないのかを判定する一番簡単な方法はinを使うことです。

>>> files = ["ab","cd","ef"]
>>> "ab" in files
True

しかしこのinを使ったやり方だと、リスト内の要素名の部分検索はできません。
どういうことかというと、以下のような場合にTrueを返してくれないのです。

>>> files = ["ab-cd","ef-gh","ij-kl"]
>>> "ab" in files
False

まぁ当然なわけですが、問題は上記の場合にTrueを返すにはどうすればよいのかということ。

最近業務で簡単なファイル検索のプログラムを書いたのですが、意外と難しく悩んだのでメモしておきます。
(for文を使えば簡単なのですが、なぜか使いたく無かった)

内包表記で簡単に記述

内包表記を使うときれいに書けます♪

>>> files = ["ab-cd","ef-gh","ij-kl"]
>>> ["ab" in files[i] for i in range(len(files))]
[True, False, False]

Trueだけ返してくれれば良い場合(あるかないかだけわかれば良い場合)にはanyを使います。

>>> files = ["ab-cd","ef-gh","ij-kl"]
>>> any(["ab" in files[i] for i in range(len(files))])
True

正直なところ、内包表記は可読性が悪い気がするのですが、
コード自体はスッキリするのでよく使ってしまいます。