具有嵌套循环和 kwargs 的函数:如何依次调用两个列表? (笛卡尔积)

Finction with nested loop and kwargs: how to invoke two lists one after another? (Cartesian product)

我正在尝试重新创建 itertools.product

我知道如何为此任务创建循环,例如:

arr1 = [1, 2, 3]
arr2 = [5, 6, 7]
arr_out = []

for i in arr1:
    for i1 in arr2:
        final = i, i1
        arr_out.append(final)
print(arr_out)

输出:

[(1, 5), (1, 6), (1, 7), (2, 5), (2, 6), (2, 7), (3, 5), (3, 6), (3, 7)]

但我想知道如何使用 kwargs 从中创建一个函数。 我尝试这样的事情:

arr1 = [1, 2, 3]
arr2 = [5, 6, 7]

def my_cool_product(**kwargs):
    
    arr_out = []
    
    for i in kwargs[0].items():
        for i1 in kwargs[1].items():
            final = i, i1
            arr_out.append(final)

print(my_cool_product(arr1, arr2))

但是不行。

输出:

TypeError: my_cool_product() takes 0 positional arguments but 2 were given

我不知道如何在嵌套循环中调用每个后续 kwarg。 我想获得与第一个示例相同的输出。

目标是不导入任何模块,就像itertools,换句话说,从头开始。

**kwargs 不适合您提议的功能。

如评论中所链接,**kwargs 用于 variadic 关键字参数函数。在您的情况下,您正在寻找任意数量的未命名列表。

假设您只有 2 个数组要获取其乘积,正如您在示例函数中暗示的那样:

def my_cool_product(**kwargs): 
    arr_out = []
    for i in kwargs["array1"]:
        for i1 in kwargs["array2"]:
            final = i, i1
            arr_out.append(final)
    return arr_out

然后您可以像这样使用它:

>>> my_cool_product(array1=[1,2,3], array2=[4,5,6])
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

但由于名称 array1array2 没有意义,因此最好使用 *args:

def my_cool_product(*args): 
    arr_out = []
    for i in args[0]:
        for i1 in args[1]:
            final = i, i1
            arr_out.append(final)
    return arr_out

>>> my_cool_product([1,2,3], [4,5,6])
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]

如需进一步支持任意数量的列表,请参阅 duplicate questions, so as for the difference between *args and **kwargs