リストが与えられた['a','ab','abc','bac']
ので、文字列を含むリストを計算したいと思い'ab'
ます。つまり、結果は['ab','abc']
です。これはPythonでどのように行うことができますか?
回答:
この単純なフィルタリングは、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']
理解を使用することをお勧めしますが。
lambda
完璧な仲間ではありませんfilter
か?ab
与えられたリストにあるかどうかをチェックするためだけに別の関数を書くのはやり過ぎだと思います。つまり、基本的にin
演算子をラップする、より一般的な関数を記述しています。ここfilter
なしで、より明確な方法でどのように使用しlambda
ますか?
[x for x in L if 'ab' in x]
# To support matches from the beginning, not any matches:
items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'
filter(lambda x: x.startswith(prefix), items)
インタラクティブシェルでこれをすばやく試してみました。
>>> 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)