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,您想用它进行切片,切片应该包括第一个元素和子字符串,或者整个列表?是的,尽管我通常做两个切片。一个查找特定数据块的标题,另一个查找在那街区的尽头。