如何用Python模式匹配干净检查变量是否为列表的列表?
问题:用Python模式匹配区分全元素为列表的列表与普通数据列表
我需要在代码中区分两种列表:记录的列表(由普通数据元素组成)和记录列表的列表(所有元素均为列表)。最初我用嵌套if语句实现逻辑:
if isinstance(input_var, list): if len(input_var) > 0: if all(isinstance(item) for item in input_var): return list_of_lists_processing(input_var) elif not any(instance(item, list) for item in input_var): return list_of_data_processing(input_var) else: raise ValueError(f"Unexpected input_var value {input_var}") else: return list() else: raise ValueError(f"Unexpected input_var value {input_var}")
这种写法不够优雅,于是我尝试用Python 3.10的模式匹配简化,写出了如下版本:
match input_var: case [list(), *_]: return list_of_lists_processing(input_var) case list(): # also process empty list case return list_of_data_processing(input_var) case _: ValueError(f"Unexpected value {input_var=}")
但这段代码有缺陷:它仅检查列表的第一个元素是否为列表,而非所有元素。虽然实际场景中这勉强能用,但我想知道:有没有简洁的方式仅匹配所有元素均为列表的列表?
我尝试过两种写法,但都有问题:
case [*list()]:会触发SyntaxErrorcase list(list()):语法正确,但不符合预期(例如它会匹配["a"]),这是怎么回事?
内容的提问来源于stack exchange,提问作者protagonist
相关产品推荐
相关产品推荐

