函数嵌套循环和kwargs:如何调用两个列表一个接一个?(笛卡儿积)



我正在尝试重新创建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用于可变关键字参数函数。在您的示例中,您正在查找任意数量的未命名列表。

假设只有两个数组你想要得到它们的乘积,就像你在例子函数中暗示的那样:

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)]

为了进一步支持任意数量的列表,请参阅重复的问题,以便了解*args**kwargs的区别。