使用模式匹配检查变量是否是列表列表的干净方法

问题描述 投票:0回答:1

在我的代码中,我需要区分记录列表和记录列表列表。现有代码是这样的:

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(), *_]
只检查input_var的第一个元素,而不是全部。实际上,这足以满足我的目的,但无论如何我想问:是否有一种干净的方法来仅匹配每个元素都是列表的列表

我尝试了

case [*list()]:
,但这会导致
SyntaxError
case list(list()):
在语法上是正确的,但无法按预期工作(例如,它匹配
["a"]
- 这是怎么回事?)

python pattern-matching
1个回答
0
投票

没有一种简单的方法可以直接匹配元素是列表的列表。因此,您可以将模式匹配与保护子句结合起来。 试试这个:

match input_var:
        # matches lists of lists using a guard clause
    case [first_list, *rest_lists] if all(isinstance(item, list) for item in [first_list] + rest_lists):
        return list_of_lists_processing(input_var)
    case list():
        # also process empty list case
        return list_of_data_processing(input_var)
        # handle other unexpected values 
    case _:
        raise ValueError(f"Unexpected value {input_var}")
© www.soinside.com 2019 - 2024. All rights reserved.