Python 3.10 中未知长度列表的结构模式匹配

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

假设我有以下功能:

def sum_ints(my_list: list[int]) -> int:
    return sum(my_list)

在开始在

my_list
中添加元素之前,我想使用新的
match
语句检查所有元素的类型。

例如,如果

my_list
的长度为2,我可以这样做:

def sum_ints(my_list: list[int]) -> int:
    match my_list:
        case [int(), int()]:
            return sum(my_list)
        case _:
            raise Exception("...")

如何将列表的大小写与

n
元素相匹配?

python match
2个回答
4
投票

我认为在你的情况下你只需要

all
内置功能。

if all(isinstance(i, int) for i in my_list):
    # Do Something
else:
    # raise Exception("...")

但是如果你真的想通过

match
语句尝试这个逻辑,你必须首先捕获元素并使用匹配守卫来验证条件,但在这种情况下这是一种复杂/不可读的解决方案。

a = [1, 2]
match a:
    case [*elements] if all(isinstance(i, int) for i in elements):
        print("All elements are int")
    case _:
        raise Exception("Elements are not int")

另请参阅:


0
投票

您可以使用递归而不是对序列进行两次迭代。

numbers = [1, 2, 3.0]
ints    = [1, 2, 3]


def sum_ints(l: list[int]) -> int:
    match l:
        case [int()]:
            return l[0]
        case [int(), *_]:
            return l[0] + sum_ints(l[1:])
        case [x, *_]:
            raise ValueError(f'{x} is {type(x)}')


print(sum_ints(ints))
try:
    print(sum_ints(numbers))
except ValueError as e:
    print(e)

但是由于 python 是鸭子类型的,有些人可能会质疑为什么人们会关心一个元素是否是

int
float
或其他什么。

© www.soinside.com 2019 - 2024. All rights reserved.