【发布时间】:2011-01-10 07:23:08
【问题描述】:
给定列表['a','ab','abc','bac'],我想计算一个包含'ab' 字符串的列表。 IE。结果是['ab','abc']。这如何在 Python 中完成?
【问题讨论】:
给定列表['a','ab','abc','bac'],我想计算一个包含'ab' 字符串的列表。 IE。结果是['ab','abc']。这如何在 Python 中完成?
【问题讨论】:
这种简单的过滤可以通过 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 中,它返回 iterator 而不是列表,但您可以强制转换它:
>>> list(filter(lambda k: 'ab' in k, lst))
['ab', 'abc']
虽然使用理解是更好的做法。
【讨论】:
lambda 不是 filter 的完美伴侣吗?我认为编写一个单独的函数来检查ab 是否在给定的列表中是一种矫枉过正的做法。编写一个更通用的函数也是如此,它基本上包装了in 运算符。如果没有lambda,您将如何更清晰地使用filter?
[x for x in L if 'ab' in x]
【讨论】:
# To support matches from the beginning, not any matches:
items = ['a', 'ab', 'abc', 'bac']
prefix = 'ab'
filter(lambda x: x.startswith(prefix), items)
【讨论】:
在交互式 shell 中快速尝试:
>>> l = ['a', 'ab', 'abc', 'bac']
>>> [x for x in l if 'ab' in x]
['ab', 'abc']
>>>
为什么会这样?因为in operator 是为字符串定义的,意思是:“是子字符串”。
另外,您可能需要考虑写出循环而不是使用上面使用的list comprehension syntax:
l = ['a', 'ab', 'abc', 'bac']
result = []
for s in l:
if 'ab' in s:
result.append(s)
【讨论】:
mylist = ['a', 'ab', 'abc']
assert 'ab' in mylist
【讨论】: