内包表記とは?
これはおそらく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
正直なところ、内包表記は可読性が悪い気がするのですが、
コード自体はスッキリするのでよく使ってしまいます。