如果某些元素是非数字的话,我想在for循环中使用lambdas返回:
strs = ['1234', 'hello', '6787']
我可以使用for
循环并遍历每个元素:
for elem in strs:
并检查elem.islpha()
。
但是,有没有办法使用lambdas
加上for
循环来返回单词"hello"
?
答案 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']
它们是最具适应性的,在大多数情况下,是最易读的方式。那你为什么要用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
干净利落,但请记住一旦涉及lambda
s后的后果。
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']
答案 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()]