在 python 中创建串联的列表产品

Create product of lists, concatenated, in python

import itertools
x = [[0,0],[1,1]]
list(itertools.product(x,x))

生产

[([0, 0], [0, 0]), ([0, 0], [1, 1]), ([1, 1], [0, 0]), ([1, 1], [1, 1])]

但我正在寻找可以产生的东西

[[0, 0, 0, 0], [0, 0, 1, 1], [1, 1, 0, 0], [1, 1, 1, 1]]

itertools.product 给了你答案,你只需要连接列表

[a + b for a, b in [([0, 0], [0, 0]), ([0, 0], [1, 1]), ([1, 1], [0, 0]), ([1, 1], [1, 1])]]
# [[0, 0, 0, 0], [0, 0, 1, 1], [1, 1, 0, 0], [1, 1, 1, 1]]

在那种情况下,您可以不使用 itertools,而是使用列表理解来轻松完成:

x = [[0, 0], [1, 1]]
output = [a + b for b in x for a in x]
# [[0, 0, 0, 0], [1, 1, 0, 0], [0, 0, 1, 1], [1, 1, 1, 1]]

没有列表理解的等价物是:

output = []
for a in x:
    for b in x:
        output.append(a + b)
print(output)

如果你正在考虑使用 numpy 数组,你可以使用 np.reshape

np.reshape(list(itertools.product(x,x)),(4,4))
Out[28]: 
array([[0, 0, 0, 0],
       [0, 0, 1, 1],
       [1, 1, 0, 0],
       [1, 1, 1, 1]])

您可以使用 maplamda 然后组合来自 itertools.product 的两个数组,如下所示:

import itertools
x = [[0,0],[1,1]]
list(map(lambda x: x[0]+x[1] , itertools.product(x,x)))

输出:

[[0, 0, 0, 0], [0, 0, 1, 1], [1, 1, 0, 0], [1, 1, 1, 1]]

加长版:

from itertools import chain
list(map(lambda x: list(chain(*x)) , itertools.product(x, repeat=4)))  
# itertools.product(x, repeat=4) <=> itertools.product(x,x,x,x)

输出:

[[0, 0, 0, 0, 0, 0, 0, 0],
 [0, 0, 0, 0, 0, 0, 1, 1],
 [0, 0, 0, 0, 1, 1, 0, 0],
 [0, 0, 0, 0, 1, 1, 1, 1],
 [0, 0, 1, 1, 0, 0, 0, 0],
 [0, 0, 1, 1, 0, 0, 1, 1],
 [0, 0, 1, 1, 1, 1, 0, 0],
 [0, 0, 1, 1, 1, 1, 1, 1],
 [1, 1, 0, 0, 0, 0, 0, 0],
 [1, 1, 0, 0, 0, 0, 1, 1],
 [1, 1, 0, 0, 1, 1, 0, 0],
 [1, 1, 0, 0, 1, 1, 1, 1],
 [1, 1, 1, 1, 0, 0, 0, 0],
 [1, 1, 1, 1, 0, 0, 1, 1],
 [1, 1, 1, 1, 1, 1, 0, 0],
 [1, 1, 1, 1, 1, 1, 1, 1]]