根据内容过滤字符串列表


101

给定list ['a','ab','abc','bac'],我想计算一个包含字符串的列表'ab'。即结果是['ab','abc']。如何在Python中完成?

Answers:


170

使用Python,可以通过多种方式实现这种简单的过滤。最好的方法是使用“列表推导”,如下所示:

>>> lst = ['a', 'ab', 'abc', 'bac']
>>> [k for k in lst if 'ab' in k]
['ab', 'abc']

另一种方法是使用该filter功能。在Python 2中:

>>> filter(lambda k: 'ab' in k, lst)
['ab', 'abc']

在Python 3中,它返回一个迭代器而不是列表,但是您可以强制转换它:

>>> list(filter(lambda k: 'ab' in k, lst))
['ab', 'abc']

尽管使用理解是更好的做法。


30
@ S.Lott:为什么?在合适的环境中学习有用的高级编程主题有什么问题?
Eli Bendersky 2010年

12
@ S.Lott:我认为lambda促进了将函数作为一类对象的考虑,这对于某些编程范例而言非常重要。我不会说它们对我来说非常重要,但是我相信即使是新手也可以从这种方式进行编程中受益,并且绝对不会将其称为“造成影响”
Eli Bendersky 2010年

6
@ S.Lott:但是在这种情况下不是lambda完美的伴侣filter吗?我认为编写一个单独的函数以检查是否ab在给定列表中是一个过大的杀伤力。因此编写基本上包装in操作符的更通用的函数也是。filter没有lambda这里,您将如何以更清晰的方式使用?
Eli Bendersky 2010年

5
不仅仅是n00bs可以找到这个答案
Bryan

9
我是n00b,现在将我介绍给lambda。知道它真棒。现在我将了解更多。
a_secenthusiast


16
# To support matches from the beginning, not any matches:

items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'

filter(lambda x: x.startswith(prefix), items)

避免将列表作为变量名,因为这是python对象类型。
罗格霍夫斯特

6

在交互式shell中快速尝试了一下:

>>> l = ['a', 'ab', 'abc', 'bac']
>>> [x for x in l if 'ab' in x]
['ab', 'abc']
>>>

为什么这样做?因为为字符串定义了in运算符,以表示:“是”的子字符串。

另外,您可能要考虑写出循环,而不是使用上面使用的列表理解语法

l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
   if 'ab' in s:
       result.append(s)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.