在 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]])
您可以使用 map
和 lamda
然后组合来自 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]]
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]])
您可以使用 map
和 lamda
然后组合来自 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]]