Python查找嵌套列表中包含指定子串的内层列表对应外层索引
Python嵌套列表子串匹配查外层索引实现方案
问题背景
现有如下结构的Python嵌套列表:
lst = [['Apple Pie', 'Carrot Cake'], ['Steak', 'Chicken']]
需求为查找包含指定子串的内层列表对应的外层索引,本例中查找子串'Carrot',预期输出结果为0。
此前实现的代码仅支持匹配内层列表的完整元素,无法完成子串匹配,原代码如下:
def find_index(l, c): for i, v in enumerate(l): if c in v: return i res = find_index(lst, 'Carrot')
可用实现方案
方案1:双重循环枚举索引(性能最优)
直接遍历外层列表的索引和元素,再遍历内层列表的每个字符串做子串匹配,匹配到就直接返回外层索引:
def find_index(l,c): for i,v in enumerate(l): for j in v: if c in j: return i # 无匹配结果时返回-1 return -1
方案2:any()简化写法(可读性最优)
用内置函数any()简化内层循环的写法,逻辑和方案1完全一致,代码更简洁易读:
def find_index(l, c): for i, v in enumerate(l): if any(c in x for x in v): return i return -1
方案3:调用list.index()获取索引
遍历到匹配项后调用列表的index()方法获取外层索引,该方法会额外遍历一次外层列表,性能略低:
def function(list_contains,word_to_know): for x in list_contains: for y in x: if word_to_know in y: return list_contains.index(x) return -1
性能测试结果
使用timeit模块对以上方案在示例数据集上做性能测试,各方案耗时如下:
- 双重循环枚举索引方案:0.005458s
- any()简化方案:0.0054626s
- 调用list.index()方案:0.0054856s
- 显式命名变量的双重循环方案:0.0054621s
几个方案的性能差异极小,常规业务场景下优先选择可读性更高的any()方案即可,性能敏感场景可选择无额外开销的双重循环枚举方案。
内容的提问来源于stack exchange,提问作者Tea-F-Tea
相关产品推荐
相关产品推荐

