8

如果某些元素是非数字的,我想在 for 循环中使用 lambdas 来返回:

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']

或者,如果您确实想使用 lambda:

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

请注意,您很少使用 lambdas 在for循环中进行过滤,这不是惯用的。从列表中过滤元素的方法是使用列表推导、生成器表达式或(不太推荐)filter()内置函数。

于 2013-06-14T02:12:12.197 回答
4

首先,习惯于列表推导:

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

它们是最具适应性的,在大多数情况下,也是最易读的方式。那你为什么要使用mapmap在简单的情况下快速且美观:

>>> 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()只是绒毛 for str.isalpha,字符串类的方法。

>>> filter(str.isalpha, strs)
['hello']

这使它在这里使用起来既干净又快速,但是一旦涉及到s filter,请记住后果。lambda

Python 2.x 的实现细节

不幸的是,python 2.x 有两种不同的字符串类型(在 python 3 中只有strunicode)strunicode. 因此,使用的清洁解决方案str.isalpha将不起作用。您可以简单地将其更改为,unicode.isalpha但如果您正在混合unicode并且str您需要交叉兼容的东西。

一种替代方法是使用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']

在循环中使用 lambda 在您的上下文中没有任何意义,因为您可以x.isalpha()直接调用

于 2013-06-14T02:17:36.197 回答
0

这可能是您正在寻找的。您不能for显式使用循环,但可以使用生成器表达式:

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

如果您想要从列表中提取非数字项,我认为不需要使用 lambda。

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