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

Python 在字符串列表中查找子字符串,返回索引,python,Python,我有一个由readlines()转储的字符串列表,我想找到包含子字符串的第一行或最后一行的索引 这是可行的,但看起来很笨重: fooIndex=listOfStrings.index((next((x for x in listOfStrings if "foo" in x),listOfStrings[-1]))) 一定有比搜索两次更好的方法,但我找不到它。在函数中使用会更具可读性和效率: def get_index(strings, substr): for idx, string

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

这是可行的,但看起来很笨重:

fooIndex=listOfStrings.index((next((x for x in listOfStrings if "foo" in x),listOfStrings[-1])))
一定有比搜索两次更好的方法,但我找不到它。

在函数中使用会更具可读性和效率:

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

请注意,您不需要对文件对象调用
.readlines()
来迭代这些行,只需将其用作一个iterable即可。

我认为没有一个好的(即可读的)单行解决方案。除了@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
代码稍微长了一点,但意图非常明确:尝试获取包含子字符串的下一个索引,或者列表长度减去1


更新:事实上,有一个很好的(好吧,稍微好一点)单行程序,你几乎可以使用它,使用
next
default
参数,但不是使用最后一个元素本身作为默认值,然后调用
index
,只需将索引本身放入并与
enumerate
组合即可:

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

你确定你需要索引吗?在我看来,最有效的方法是直接循环文件内容(不要调用readlines)并在看到包含所需文本的行时停止/返回。您可以在迭代时使用
enumerate
获取每行的索引。我正在切片数据块,因此,我认为将索引切片子列表传递给包含
numpy.genfromtxt
的函数更有效,特别是因为如果没有干净的数据块,我无法停止抛出值错误(我想我应该问另一个问题)。第二个问题或多或少就是我要找的,虽然我将使用索引对列表进行切片,但我甚至不需要
len(字符串列表)
,我可以将默认值设置为
-1

下一步((I表示I,e在枚举中(字符串列表),如果e中有子字符串),-1)
@DanielForsman Yes,用于切片(对于几乎所有其他目的而言)这两种方法都是可互换的。不过,请注意,切片到
[…:-1]
将排除最后一个元素。不确定您是否需要。不,我不需要!谢谢。@DanielForsman,您想用它进行切片,切片应该包括第一个元素和子字符串,或者整个列表?是的,尽管我通常做两个切片。一个查找特定数据块的标题,另一个查找在那街区的尽头。