考虑下面的函数:
它接受列表的列表作为输入,并从每个列表中查找元素的所有组合。
def product(llist):
result = [[]]
for lst in llist:
result = [x + [y] for x in result for y in lst]
return result
例如:
product([[1,2], [3], [4,5]])
将返回:
[[1, 3, 4], [1, 3, 5], [2, 3, 4], [2, 3, 5]]
我试图理解这个函数是如何工作的,并因此尝试扩展列表的理解。
下面是一个尝试:
def product2(llist):
result = [[]]
for lst in llist:
for x in result:
result = []
for y in lst:
result.append(x+[y])
return result
这并没有给出正确的结果,它返回:
[[2, 3, 4], [2, 3, 5]]
根据product2
的定义,我理解这个不正确的结果。但是我无法扩展原始的product
函数来理解它是如何工作的。
有人能详细解释一下product
函数中的嵌套列表理解吗?
发布于 2018-10-16 07:30:09
列表理解是为lst
中的每个元素创建一个新列表,并通过将这个小的单个元素列表与result
中已有的所有列表相结合来创建更多的新列表。
因此,例如,如果是result = [ [1, 2], [3, 4] ]
和lst = [10, 11]
,则新结果将为[[1, 2, 10], [1, 2, 11], [3, 4, 10], [3, 4, 11]]
。
它对llist
中的每个lst
执行此操作
def product2(llist):
result = [[]]
for lst in llist:
new_result = [] # let's manually build out new result
for existing in result:
for element in lst:
new_result.append(existing + [element])
result = new_result # update result for next lst
return result
发布于 2018-10-16 07:37:01
如果打印result
的部分值会很有帮助,如下所示:
def product(llist):
result = [[]]
for lst in llist:
result = [x + [y] for x in result for y in lst]
print(result)
return result
首先,结果的内部list
是空的,因此它将为传递的第一个内部列表中的每个元素创建一个新的内部列表:
[[1], [2]]
然后在第二次传递中,结果中的每个内部列表将被替换为自身加上第二个内部列表中的每个元素作为参数传递:
[[1, 3], [2, 3]]
然后,当您有一个包含多个元素的内部参数列表时,它将在结果中复制当前现有的内部列表
[[1, 3, 4], [1, 3, 5], [2, 3, 4], [2, 3, 5]]
它是这样发生的,因为在一次遍历列表理解的过程中,有问题的列表将不会被更新。它将只在理解结束时更新。
你可以看到的另一种方式类似于网格:
------------------
| | 1 | 2 |
------------------
| [] | [1] | [2] |
------------------
result = [[1],[2]]
---------------
| | 3 |
---------------
| [1] | [1,3] |
---------------
| [2] | [2,3] |
---------------
result = [[1,3],[2,3]]
-----------------------------
| | 4 | 5 |
-----------------------------
| [1,3] | [1,3,4] | [1,3,5] |
-----------------------------
| [2,3] | [2,3,4] | [2,3,5] |
-----------------------------
result = [[1,3,4],[2,3,4],[1,3,5],[2,3,5]]
考虑到这一点,没有理解的版本将需要一个临时变量来保存更新的值:
def product2(llist):
result = [[]]
for lst in llist:
temp_res = []
for x in result:
for y in lst:
temp_res.append(x+[y])
result = temp_res
return result
https://stackoverflow.com/questions/52825941
复制相似问题