繁体   English   中英

获取包含子字符串的第一个列表索引?

[英]Get first list index containing sub-string?

对于列表,方法list.index(x)返回值为x的第一项在列表中的索引。 但是如果我想查看列表项的内部,而不仅仅是查看整个项目,我该如何为此制作最 Pythoninc 方法?

例如,与

l = ['the cat ate the mouse',
     'the tiger ate the chicken',
     'the horse ate the straw']

这个 function 将返回1并提供参数tiger

一个非光滑的方法:

def index_containing_substring(the_list, substring):
    for i, s in enumerate(the_list):
        if substring in s:
              return i
    return -1

单线:

index = [idx for idx, s in enumerate(l) if 'tiger' in s][0]

abyx 解决方案的变化(优化为找到匹配时停止)

def first_substring(strings, substring):
    return next(i for i, string in enumerate(strings) if substring in string)

如果你是 2.6 之前的你需要把next()放在最后

def first_substring(strings, substring):
    return (i for i, string in enumerate(strings) if substring in string).next()

这是非常巧妙且相当有效的。

>>> def find(lst, predicate):
...     return (i for i, j in enumerate(lst) if predicate(j)).next()
... 
>>> l = ['the cat ate the mouse','the tiger ate the chicken','the horse ate the straw']
>>> find(l, lambda x: 'tiger' in x)
1

唯一的问题是,如果未找到该项目,它将引发 StopIteration(尽管这很容易补救)。

def find(l, s):
    for i in range(len(l)):
        if l[i].find(s)!=-1:
            return i
    return None # Or -1
def first_substring(strings, substring):
    return min(i for i, string in enumerate(strings) if substring in string)

注意:如果找不到匹配项,这将引发ValueError ,这在我看来更好。

恕我直言,使用这一行,您将只找到第一次出现,而无需处理整个列表

index = next((i for i in enumerate(l) if "tiger" in i[1]),[-1,-1])[0]

  >>> li = ['my','array','with','words']
  >>> reduce(lambda tup, word: (tup[0], True) if not tup[1] and word  == 'my' else (tup[0]+1 if not tup[1] else tup[0], tup[1]), li, (0, False))[0]
  0
  >>> reduce(lambda tup, word: (tup[0], True) if not tup[1] and word  == 'words' else (tup[0]+1 if not tup[1] else tup[0], tup[1]), li, (0, False))[0]
  3

使用地图功能:

index = np.nonzero(map(lambda x: substring in x, strings))[0][0]

@kennytm 提供了一个很好的答案,对我有帮助; 从他们的构建一个允许正则表达式的 function,我写道:

def substringindex(inputlist, inputsubstring):
    s = [x for x in inputlist if re.search(inputsubstring, x)]

    if s != []:
        return (inputlist.index(s[0]), s[0])
    return -1

这个 function 和他们的完全一样,但支持正则表达式。

如果找不到项目,我只想获取文本而不引发异常

search = 'a'
next((s for s in ["aa",'c'] if search in s), None)

search = 'b'
next((el for el in ["aa",'c'] if search in el), None)

这是我希望在本地实现的事情之一。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM