在Python中提取包含字符串的列表项,没有列表推导?

时间:2015-10-14 17:21:56

标签: python list python-2.7 indexing list-comprehension

给出一个清单:

my_list = ['abc', 'def', 'ghi']

我想提取包含' ab' (其中只有一个)。

而不是像......那样有点令人费解的事情:

[i for i in my_list if 'ab' in i][0]

我正在寻找一些方法来应用与XPath contains()等效的东西,但是要列出一个列表。

4 个答案:

答案 0 :(得分:2)

如果您担心迭代整个列表:

In [50]: L = ['abc', 'def', 'ghi']

In [51]: next(itertools.dropwhile(lambda s: 'ab' not in s, L))
Out[51]: 'abc'

不要忘记import itertools

答案 1 :(得分:2)

您可以使用filter

>>> my_list = ['abc', 'def', 'ghi']
>>> filter(lambda x: 'ab' in x, my_list)
['abc']
>>>

您还可以创建一个可以调用列表的函数:

>>> from functools import partial
>>> my_ab_func = partial(filter, lambda x: 'ab' in x)
>>> my_ab_func(my_list)
['abc']
>>> my_list2 = ['dabd', 'no','yes', 'zyx']
>>> my_ab_func(my_list2)
['dabd']
>>>

答案 2 :(得分:1)

使用ifilter中的itertools,它返回迭代器而不是list:

from itertools import ifilter

my_list = ['abc', 'def', 'ghi']  

next(ifilter(lambda x: 'ab' in x, my_list))

答案 3 :(得分:1)

  

而不是像......那样有点令人费解的事情:

     
[i for i in my_list if 'ab' in i][0]

列表理解对于Python来说非常惯用。如果您的列表很小,您所拥有的是probably sufficient并进行了一些额外的错误检查:

def lcontains(needle_s, haystack_l):
    try: return [i for i in haystack_l if needle_s in i][0]
    except IndexError: return None

# Example use:
lcontains('ab', my_list)

话虽如此,如果您的输入列表(或更一般地说,可迭代)可能很大,您可以考虑使用itertools

import itertools

try:
    irange = xrange # Python 2
    ifilter = itertools.ifilter
except NameError:
    irange = range # Python 3
    ifilter = filter

def oneornone(iterable):
    try: return iterable.next()
    except StopIteration: return None

icontains = lambda predicate_f, haystack_i: oneornone(ifilter(predicate_f, haystack_i))

# Example use:
result = icontains(lambda i: i % 3323 == 0, irange(2, 1000000000000, 5))

# Or, in your case:
result = icontains(lambda i: 'ab' in i, mylist)