如何在包含布尔值的列表中检查子字符串存在且不修改原数据
问题背景
需要检查嵌套列表中是否存在指定子字符串,但列表中混有布尔值无法直接统一做字符串操作,希望找到不需要修改原数据的高效实现方案。
原实现代码
def replace_falseTrue_as_strings(lst): for i in lst: if isinstance(i,list): for j in i: if all(not isinstance(j,list)): for k in j: k_new.append(str(k)) return k if any(isinstance(j,list)): return replace_falseTrue_as_strings(j) else: i_new.append(str(i)) return j_new
解决方案
你不需要提前把所有布尔值转成字符串修改原数据,只需在遍历做子串匹配前加一层类型判断,跳过布尔值仅对字符串做匹配即可,该方案不会修改原列表任何内容,也能正确处理任意深度的嵌套列表结构。
实现代码
def check_substring_in_nested_list(lst: list, target_substr: str) -> bool: for item in lst: if isinstance(item, list): # 递归处理嵌套列表 if check_substring_in_nested_list(item, target_substr): return True elif isinstance(item, str): # 仅对字符串类型做子串匹配 if target_substr in item: return True # 布尔值、数字等非字符串类型直接跳过,无需处理 return False
调用示例
# 测试用例(包含布尔值、嵌套列表、字符串、其他类型数据) test_list = [True, "hello world", False, [1, "test demo", [True, "target content"]], None] print(check_substring_in_nested_list(test_list, "target")) # 输出 True print(check_substring_in_nested_list(test_list, "not exist")) # 输出 False
原代码问题说明
你当前的实现存在几个明显缺陷:
- 使用了未在函数内定义的全局变量
k_new、i_new、j_new,运行会直接报错 - 递归返回逻辑错误,仅遍历到第一个非列表元素/子列表就会提前终止,无法遍历全量数据
- 会额外生成转换后的新列表,占用不必要的内存空间
内容的提问来源于stack exchange,提问作者Shivam Anand
相关产品推荐
相关产品推荐

