内容に基づいて文字列のリストをフィルタリングする


101

リストが与えられた['a','ab','abc','bac']ので、文字列を含むリストを計算したいと思い'ab'ます。つまり、結果は['ab','abc']です。これはPythonでどのように行うことができますか?

回答:


170

この単純なフィルタリングは、Pythonを使用してさまざまな方法で実現できます。最善のアプローチは、次のように「リスト内包」を使用することです。

>>> lst = ['a', 'ab', 'abc', 'bac']
>>> [k for k in lst if 'ab' in k]
['ab', 'abc']

別の方法は、filter関数を使用することです。Python 2の場合:

>>> filter(lambda k: 'ab' in k, lst)
['ab', 'abc']

Python 3では、リストの代わりにイテレーターを返しますが、キャストすることはできます。

>>> list(filter(lambda k: 'ab' in k, lst))
['ab', 'abc']

理解を使用することをお勧めしますが。


30
@ S.Lott:なぜですか?適切なコンテキストで有用な高度なプログラミングトピックを学習することの何が問題になっていますか?
Eli Bendersky 2010年

12
@ S.Lott:ラムダは、関数をファーストクラスのオブジェクトとして検討するのを容易にしていると思います。これは、一部のプログラミングパラダイムにとって重要です。それらが私にとって非常に重要であるとは言いませんが、初心者でさえ、この方法でプログラミングを考えることから利益を得ることができ、間違いなくそれを苦しめるとは言いません。
Eli Bendersky 2010年

6
@ S.Lott:しかし、この場合のlambda完璧な仲間ではありませんfilterか?ab与えられたリストにあるかどうかをチェックするためだけに別の関数を書くのはやり過ぎだと思います。つまり、基本的にin演算子をラップする、より一般的な関数を記述しています。ここfilterなしで、より明確な方法でどのように使用しlambdaますか?
Eli Bendersky 2010年

5
この答えを見つけるのはn00bsだけではありません
ブライアン

9
私はn00bですが、ラムダを紹介しました。それを知って素晴らしい気分です。今、私はそれについてもっと学びます。
a_secenthusiast 2015年


16
# To support matches from the beginning, not any matches:

items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'

filter(lambda x: x.startswith(prefix), items)

これはPythonオブジェクトタイプであるため、変数名としてのリストは避けてください。
Rutger Hofste 2018

6

インタラクティブシェルでこれをすばやく試してみました。

>>> l = ['a', 'ab', 'abc', 'bac']
>>> [x for x in l if 'ab' in x]
['ab', 'abc']
>>>

なぜこれが機能するのですか?のでin、オペレータは、平均への文字列のために定義されています「のサブれます」。

また、上記で使用したリスト内包表記構文を使用するのではなく、ループを書き出すことを検討することもできます

l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
   if 'ab' in s:
       result.append(s)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.