簡體   English   中英

在Python中提取一個包含字符串的列表項,而無需列表理解?

[英]Extract a list item in Python that contains a string, without list comprehension?

給定一個列表:

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

我想提取包含“ ab”的元素(其中將永遠只有一個)。

而不是像一些令人費解的事情:

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

我在尋找某種方法來應用與XPath contains()等效的方法,但要使用列表。

如果您擔心要遍歷整個列表:

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

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

不要忘記import itertools

您可以使用過濾器

>>> 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']
>>>

使用itertools ifilter ,它返回迭代器而不是列表:

from itertools import ifilter

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

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

而不是像一些令人費解的事情:

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

列表理解對於Python來說是非常習慣的。 如果你的列表是小,你有什么是可能足夠了一些額外的錯誤檢查:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM