Lambdas Python for循环

时间:2013-06-14 02:07:51

标签: python lambda

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

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

我可以使用for循环并遍历每个元素:

for elem in strs:

并检查elem.islpha()

但是,有没有办法使用lambdas加上for循环来返回单词"hello"

5 个答案:

答案 0 :(得分:11)

试试这个,使用列表理解很容易:

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

或者如果你肯定想要使用lambda:

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

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

答案 1 :(得分: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()只是str.isalpha的漏洞,是字符串类的方法。

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

这样可以让您在此处使用filter干净利落,但请记住一旦涉及lambda s后的后果。

Python 2.x的实现细节

不幸的是,python 2.x有两种不同的字符串类型(在python 3中只有str是unicode)strunicode。因此,使用str.isalpha的干净解决方案将无效。您只需将此更改为unicode.isalpha,但如果您要混合unicodestr,则需要交叉兼容。

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

答案 2 :(得分:1)

如果您确实需要使用lambda,或者您正在学习函数式编程,则可以使用filter

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

在你的上下文中使用lambda在你的上下文中是没有意义的,因为你可以直接调用x.isalpha()

答案 3 :(得分:0)

这可能就是你要找的东西。您不能显式使用for循环,但可以使用生成器表达式:

check_isalpha = lambda lst: (elem for elem in lst if elem.isalpha())[0]

答案 4 :(得分:0)

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

alphas = [item for item in strs if item.isalpha()]