我有readlines()
转储的字符串列表,我想找到包含子字符串或最后一行的第一行的索引。
这很有效,但看起来很笨重:
fooIndex=listOfStrings.index((next((x for x in listOfStrings if "foo" in x),listOfStrings[-1])))
必须有比搜索两次更好的方法,但我找不到它。
答案 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()
来迭代这些行 - 只需将其用作可迭代的。