在字符串列表中查找子字符串,返回索引

时间:2016-07-13 14:23:08

标签: python

我有readlines()转储的字符串列表,我想找到包含子字符串或最后一行的第一行的索引。

这很有效,但看起来很笨重:

fooIndex=listOfStrings.index((next((x for x in listOfStrings if "foo" in x),listOfStrings[-1])))

必须有比搜索两次更好的方法,但我找不到它。

2 个答案:

答案 0 :(得分:3)

我认为没有一个好的(即可读的)单行解决方案。对于@ eugene的循环,您也可以使用try/except

def get_index(list_of_strings, substring):
    try:
        return next(i for i, e in enumerate(list_of_strings) if substring in e)
    except StopIteration:
        return len(list_of_strings) - 1

代码有点长,但恕我直言的意图很明确:尝试获取包含子字符串的下一个索引,或列表的长度减去一个。

更新:事实上,一个好的(好的,有点好的)单行,你几乎拥有它,使用default next参数},但不是将最后一个元素本身作为默认值,然后调用index,只需将索引本身与enumerate结合使用:

next((i for i, e in enumerate(list_of_strings) if substring in e), 
     len(list_of_strings) - 1)

答案 1 :(得分:2)

在函数中使用enumerate()将更具可读性和效率:

def get_index(strings, substr):
    for idx, string in enumerate(strings):
        if substr in string:
            break
    return idx

请注意,您不需要在文件对象上调用.readlines()来迭代这些行 - 只需将其用作可迭代的。