如何修正Python多层嵌套列表扁平化代码,正确处理最内层列表?
问题:修正嵌套列表提取逻辑
原始嵌套列表结构:
['p', [['p', 'q'], [['~p', '~r'], [['r', '~s'], ['s', '~q']]]]]
需求:提取所有包含字符串的列表,期望输出:
['p', ['p', 'q'], ['~p', '~r'], ['r', '~s'], ['s', '~q']]
现有实现代码:
def flatten_nested_list(nested_list): flat_list = [] for item in nested_list: if isinstance(item, list) and isinstance(item[1], list): flat_list.append(item[0]) flat_list.extend(flatten_nested_list(item[1])) else: flat_list.append(item) return flat_list nested_list = ['p', [['~p', 'q'], [['~p', '~r'], [['r', '~s'], ['s', '~q']]]]] flat_result = flatten_nested_list(nested_list) print(flat_result)
当前错误输出:
['p', ['~p', 'q'], ['~p', '~r'], ['r', '~s'], 's', '~q']
修正方案
问题根源在于对最内层列表的判断逻辑:现有代码会把最内层列表的单个元素拆分添加,因为最内层列表的第二个元素不是列表,触发了else分支逐个处理元素。我们需要调整判断逻辑,先识别最内层列表(即列表内所有元素都不是列表),直接将整个列表加入结果;非最内层列表则提取第一个元素,再递归处理第二个元素。
修改后的代码:
def flatten_nested_list(nested_list): flat_list = [] for item in nested_list: # 判断当前项是否为列表 if isinstance(item, list): # 检查是否为最内层列表:所有子元素都不是列表 is_leaf = all(not isinstance(sub_item, list) for sub_item in item) if is_leaf: flat_list.append(item) else: # 非最内层,提取第一个元素并递归处理第二个元素 flat_list.append(item[0]) flat_list.extend(flatten_nested_list(item[1])) else: # 非列表项直接添加(对应顶层单个元素如'p') flat_list.append(item) return flat_list nested_list = ['p', [['~p', 'q'], [['~p', '~r'], [['r', '~s'], ['s', '~q']]]]] flat_result = flatten_nested_list(nested_list) print(flat_result)
运行后输出符合预期:
['p', ['~p', 'q'], ['~p', '~r'], ['r', '~s'], ['s', '~q']]
内容的提问来源于stack exchange,提问作者Jimmeh
相关产品推荐
相关产品推荐

