如果某些元素是非数字的,我想在 for 循环中使用 lambdas 来返回:
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']
或者,如果您确实想使用 lambda:
filter(lambda x: x.isalpha(), lst)
=> ['hello']
请注意,您很少使用 lambdas 在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()
只是绒毛 for str.isalpha
,字符串类的方法。
>>> filter(str.isalpha, strs)
['hello']
这使它在这里使用起来既干净又快速,但是一旦涉及到s filter
,请记住后果。lambda
Python 2.x 的实现细节
不幸的是,python 2.x 有两种不同的字符串类型(在 python 3 中只有str
unicode)str
和unicode
. 因此,使用的清洁解决方案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']
如果你真的需要使用lambda
,或者你正在学习函数式编程,你可以使用filter
:
>>> filter(lambda x:x.isalpha(), ['123','hello','456'])
['hello']
在循环中使用 lambda 在您的上下文中没有任何意义,因为您可以x.isalpha()
直接调用
这可能是您正在寻找的。您不能for
显式使用循环,但可以使用生成器表达式:
check_isalpha = lambda lst: (elem for elem in lst if elem.isalpha())[0]
如果您想要从列表中提取非数字项,我认为不需要使用 lambda。
alphas = [item for item in strs if item.isalpha()]