特定の要素が数値でない場合に返すために、 for ループ内でラムダを使用したかったのです。
strs = ['1234', 'hello', '6787']
for
ループを使用して、各要素を反復処理できます。
for elem in strs:
とチェックしelem.islpha()
ます。
ただし、単語を返すためにループとlambdas
組み合わせて使用する方法はありますか?for
"hello"
これを試してみてください。リスト内包表記を使用すると簡単です。
lst = ['1234', 'hello', '6787']
[x for x in lst if x.isalpha()]
=> ['hello']
または、絶対にラムダを使用したい場合:
filter(lambda x: x.isalpha(), lst)
=> ['hello']
ループ内のフィルタリングにラムダを使用することはめったにないことに注意してくださいfor
。これは慣用的ではありません。リストから要素をフィルタリングする方法は、リスト内包表記、ジェネレーター式、または (あまりお勧めしませんが)filter()
組み込み関数を使用することです。
まず、リスト内包表記に慣れます。
>>> strs = ['1234', 'hello', '6787']
>>> [s for s in strs if s.isalpha()]
['hello']
それらは最も適応性が高く、ほとんどの場合、これを行う最も読みやすい方法です。では、なぜ使用するのmap
ですか?map
単純なケースでは高速で見栄えがします。
>>> map(str.upper, strs)
['1234', 'HELLO', '6787']
しかし、あなたが使用しなければならないインスタンスはlambda
、マップが醜く遅くなります。この規則は にも適用されfilter
ます。
In [1]: strs = ['1234', 'hello', '6787']
In [2]: %timeit map(lambda s: s[0] if s.isalpha() else s, strs)
1000000 loops, best of 3: 1.48 us per loop
In [3]: %timeit [s[0] if s.isalpha() else s for s in strs]
1000000 loops, best of 3: 799 ns per loop
多くの人が提案した
>>> filter(lambda s: s.isalpha(), strs)
['hello']
しかし、文字列クラスのメソッドである については、lambda s: s.isalpha()
単なる綿毛であることを覚えておいてください。str.isalpha
>>> filter(str.isalpha, strs)
['hello']
これにより、filter
ここで使用するのがクリーンで高速になりますが、 s を使用すると結果が生じることに注意してくださいlambda
。
Python 2.x の実装の詳細
残念ながら、python 2.x には 2 つの異なる文字列型があります (python 3 にstr
は Unicode のみがあります)str
とunicode
. したがって、使用str.isalpha
するクリーンなソリューションは機能しません。これを単純に変更することもできunicode.isalpha
ますが、混合unicode
しstr
ていて相互互換性のあるものが必要な場合。
1つの代替手段は、使用することですmethodcaller
>>> strs = [u'\n', u'test', u'\t']
>>> from operator import methodcaller
>>> filter(methodcaller('isalpha'), strs)
[u'test']
しかし、これはあまり簡単ではありません。そのため、リスト内包表記を使用してこの問題を回避することをお勧めします。
>>> [s for s in strs if s.isalpha()]
[u'test']
本当に を使用する必要がある場合lambda
、または関数型プログラミングを学んでいる場合は、以下を使用できますfilter
。
>>> filter(lambda x:x.isalpha(), ['123','hello','456'])
['hello']
x.isalpha()
ループ内でラムダを使用しても、コンテキストでは意味がありません。直接呼び出すことができるからです。
リストから数値以外の項目を取得したい場合、ラムダを使用する必要はないと思います。
alphas = [item for item in strs if item.isalpha()]
これはおそらくあなたが探しているものです。for
ループを明示的に使用することはできませんが、ジェネレータ式を使用できます。
check_isalpha = lambda lst: (elem for elem in lst if elem.isalpha())[0]