我遇到了以下片段(并且可以追溯到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]]
Run Code Online (Sandbox Code Playgroud)
如果我们更改以下行:
result = [[]]
Run Code Online (Sandbox Code Playgroud)
对此:
result = []
Run Code Online (Sandbox Code Playgroud)
然后代码不起作用.
现在考虑下面的一段代码,其中变量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]]
Run Code Online (Sandbox Code Playgroud)
所以在cartesian_product我上面提到的函数中,有result=[[]]和没有意义是result=[]什么?
循环中的列表理解是:
[x+[y] for x in result for y in pool]
Run Code Online (Sandbox Code Playgroud)
这包含表达式x+[y],其中x是元素result.这会尝试将一个元素添加result到列表中.因此结果的每个元素都需要是一个列表.这就是为什么result初始化为[[]]一个包含一个元素的列表,它是一个列表(一个空列表).如果这样做result = [],则没有元素result,因此循环将立即结束并且不执行任何操作.
你的第二个例子是不同的,因为你没有对元素做任何事情my_list.你只需添加新元素.此外,您不会遍历列表,因此不要求它包含任何内容.
没什么特别的[[]].只是cartesian_product正在进行的特定操作要求它在列表列表上操作.类似地,如果您要编写一个函数,例如,列表中的元素的平均值,您需要确保列表中包含数字(因此添加它们是有意义的)并且是非空的(因为否则您当试图找到平均值时,要除以零.
| 归档时间: |
|
| 查看次数: |
50 次 |
| 最近记录: |