8

特定の要素が数値でない場合に返すために、 for ループ内でラムダを使用したかったのです。

strs = ['1234', 'hello', '6787']

forループを使用して、各要素を反復処理できます。

for elem in strs:

とチェックしelem.islpha()ます。

ただし、単語を返すためにループとlambdas組み合わせて使用​​する方法はありますか?for"hello"

4

5 に答える 5

16

これを試してみてください。リスト内包表記を使用すると簡単です。

lst =  ['1234', 'hello', '6787']
[x for x in lst if x.isalpha()]
=>  ['hello']

または、絶対にラムダを使用したい場合:

filter(lambda x: x.isalpha(), lst)
=>  ['hello']

ループ内のフィルタリングにラムダを使用することはめったにないことに注意してくださいfor。これは慣用的ではありません。リストから要素をフィルタリングする方法は、リスト内包表記、ジェネレーター式、または (あまりお勧めしませんが)filter()組み込み関数を使用することです。

于 2013-06-14T02:12:12.197 に答える
4

まず、リスト内包表記に慣れます。

>>> 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 のみがあります)strunicode. したがって、使用str.isalphaするクリーンなソリューションは機能しません。これを単純に変更することもできunicode.isalphaますが、混合unicodestrていて相互互換性のあるものが必要な場合。

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']
于 2013-06-14T04:07:47.490 に答える
1

本当に を使用する必要がある場合lambda、または関数型プログラミングを学んでいる場合は、以下を使用できますfilter

>>> filter(lambda x:x.isalpha(), ['123','hello','456'])
['hello']

x.isalpha()ループ内でラムダを使用しても、コンテキストでは意味がありません。直接呼び出すことができるからです。

于 2013-06-14T02:17:36.197 に答える
0

リストから数値以外の項目を取得したい場合、ラムダを使用する必要はないと思います。

alphas = [item for item in strs if item.isalpha()]
于 2013-06-14T02:12:45.393 に答える
0

これはおそらくあなたが探しているものです。forループを明示的に使用することはできませんが、ジェネレータ式を使用できます。

check_isalpha = lambda lst: (elem for elem in lst if elem.isalpha())[0]
于 2013-06-14T02:10:07.557 に答える