如何检查嵌套列表的对称性?附示例说明
检查嵌套列表的对称性
根据你给出的示例,这里的“对称性”指的是嵌套列表在每一层级上,所有元素的结构完全一致——具体来说:
- 同一列表内的所有元素,要么都是非列表类型(且类型相同),要么都是列表类型
- 若为列表类型,所有子列表的长度必须相同,且子列表的对应位置元素也满足结构一致的要求(递归生效)
实现思路
- 先定义辅助函数,用于检查两个元素的结构是否一致:
- 若两者都不是列表,只需类型相同即可
- 若一个是列表一个不是,直接判定结构不一致
- 若都是列表,先检查长度是否相同,再递归检查每个对应位置的元素结构
- 主函数遍历列表的所有元素,以第一个元素为基准,检查其余元素是否和基准结构一致
- 递归检查每个子元素的结构对称性
代码实现(Python)
def has_same_structure(a, b): # 非列表元素:类型相同则结构一致 if not isinstance(a, list) and not isinstance(b, list): return type(a) == type(b) # 一个是列表一个不是,结构不匹配 if isinstance(a, list) != isinstance(b, list): return False # 列表长度不同,结构不匹配 if len(a) != len(b): return False # 递归检查每个对应位置的元素结构 for elem_a, elem_b in zip(a, b): if not has_same_structure(elem_a, elem_b): return False return True def is_nested_symmetric(lst): # 非列表元素自身结构对称 if not isinstance(lst, list): return True # 空列表或单元素列表直接对称 if len(lst) <= 1: return True # 以第一个元素为基准,检查所有其他元素的结构 base_structure = lst[0] for elem in lst[1:]: if not has_same_structure(base_structure, elem): return False # 递归检查每个子元素的对称性 for elem in lst: if not is_nested_symmetric(elem): return False return True
示例验证
用你给出的测试用例验证:
- 对称案例1
test1 = [[[0], [2]], [[0], [2]], [[0], [2]]] print(is_nested_symmetric(test1)) # 输出 True
外层所有子列表结构一致,每个子列表的内部元素也都是结构一致的列表,符合对称要求。
- 不对称案例1
test2 = [[[0], [2]], [[0], [2, 2]], [[0], [2]]] print(is_nested_symmetric(test2)) # 输出 False
中间子列表的第二个元素是长度为2的列表,和其他子列表的对应元素(长度为1的列表)结构不一致,判定为不对称。
- 对称案例2
test3 = [[0,1,2], [3,4,5]] print(is_nested_symmetric(test3)) # 输出 True
外层两个子列表都是长度为3的数字列表,结构完全一致,符合对称要求。
- 不对称案例2
test4 = [[[2, [3]]]] print(is_nested_symmetric(test4)) # 输出 False
最内层列表的元素一个是数字、一个是列表,结构不匹配,判定为不对称。
- 对称案例3
test5 = [[[[2], [3]]]] print(is_nested_symmetric(test5)) # 输出 True
最内层的两个子列表都是长度为1的数字列表,结构一致;外层所有层级的元素结构也都匹配,符合对称要求。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

