具有嵌套循环和 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)]
但由于名称 array1
和 array2
没有意义,因此最好使用 *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
。
我正在尝试重新创建 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)]
但由于名称 array1
和 array2
没有意义,因此最好使用 *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
。