我遇到了以下代码段(并且可以将其原点追溯到https://docs.python.org/3/library/itertools.html#itertools.product):
def cartesian_product(pools):
result = [[]]
for pool in pools:
result = [x+[y] for x in result for y in pool]
return result
a_list=[1, 2, 3]
b_list=[4, 5]
all_list=[a_list, b_list]
print (cartesian_product(all_list)) # [[1, 4], [1, 5], [2, 4], [2, 5], [3, 4], [3, 5]]
如果我们更改以下行:
result = [[]]
到此:
result = []
然后代码无效。
现在考虑以下代码,其中变量my_list
初始化为my_list=[]
而不是my_list=[[]]
,但我们仍然可以得到预期结果:
my_list=[]
my_list.append([1,2])
my_list.append([3,4])
print (my_list) # [[1, 2], [3, 4]]
因此,在我上面提到的函数cartesian_product
中,拥有result=[[]]
而不是result=[]
的重要性是什么?
答案 0 :(得分:5)
循环内的列表理解是:
[x+[y] for x in result for y in pool]
这包含表达式x+[y]
,其中x
是result
的元素。这会尝试将result
的元素添加到列表中。因此结果的每个元素都需要是一个列表。这就是为什么result
被初始化为[[]]
的原因,这是一个包含一个元素的列表,它是一个列表(一个空列表)。如果您执行result = []
,则result
中没有元素,因此循环将立即结束并且不执行任何操作。
你的第二个例子是不同的,因为你没有对my_list
的元素做任何事情。你只需添加新元素。此外,您不会遍历列表,因此不要求它包含任何内容。
[[]]
没有什么特别之处。只是cartesian_product
正在执行的特定操作要求它在列表列表上运行。类似地,如果您要编写一个函数,例如,列表中的元素的平均值,您需要确保列表中包含数字(因此添加它们是有意义的)并且是非空的(因为否则您在试图找到平均值时,将其除以零。