Помогает, если вы печатаете частичные значения 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