python 中的部分 itertools.product
Partial itertools.product in python
我想根据可能值列表 [0, 1, 2, 3]
:
在 Python 中创建以下元组列表
(0, 0, 0), # all set to first value: 0
(0, 0, 1),
(0, 0, 2),
(0, 0, 3),
(0, 1, 0),
(0, 2, 0),
(0, 3, 0),
(1, 0, 0),
(2, 0, 0),
(3, 0, 0),
(3, 3, 3), # all set to last value: 3
总结一下:
- 元组所有元素的第一个值 (
0
)
- 值列表 (
[0, 1, 2, 3]
) 中给定元组元素和其他元素设置为 0 的每个值
- 元组所有元素的最后一个值(
3
)
什么是有效的方法? ...也许有一个神奇的功能可以做到这一点?
我先想到的是用itertools.product
然后过滤:
list(product([0, 1, 2, 3], repeat=3))
... 或者可能使用 pandas
(虽然看起来有点矫枉过正)。
谢谢
我发现了一个超级丑陋的方法,可能需要优化(但至少它是有效的):
[
t for t in product(range(4), repeat=3)
if all(e==0 for e in t) or all(e==3 for e in t) or sum([e!=0 for e in t])==1
]
[编辑]
我找到了另一种使用 chain
和 product
构建列表的方法:
from itertools import chain, product
values = list(range(4)) # basically: [0, 1, 2, 3]
dflt = [values[0]] * 3 # basically: [0, 0, 0]
list(
chain(
[tuple([values[0]] * 3)],
(tuple(dflt[:i] + [v] + dflt[i + 1 :]) for i, v in product(range(3), values[1:])),
[tuple([values[-1]] * 3)],
)
)
结果如下:
[(0, 0, 0),
(1, 0, 0),
(2, 0, 0),
(3, 0, 0),
(0, 1, 0),
(0, 2, 0),
(0, 3, 0),
(0, 0, 1),
(0, 0, 2),
(0, 0, 3),
(3, 3, 3)]
你可以理解这个列表
for x in [ (a,b,c)
for a in range(4)
for b in range(4)
for c in range(4)
if a+b == 0
or b+c == 0
or a+c == 0
or a+b+c == 9
]: print(x)
我想根据可能值列表 [0, 1, 2, 3]
:
(0, 0, 0), # all set to first value: 0
(0, 0, 1),
(0, 0, 2),
(0, 0, 3),
(0, 1, 0),
(0, 2, 0),
(0, 3, 0),
(1, 0, 0),
(2, 0, 0),
(3, 0, 0),
(3, 3, 3), # all set to last value: 3
总结一下:
- 元组所有元素的第一个值 (
0
) - 值列表 (
[0, 1, 2, 3]
) 中给定元组元素和其他元素设置为 0 的每个值 - 元组所有元素的最后一个值(
3
)
什么是有效的方法? ...也许有一个神奇的功能可以做到这一点?
我先想到的是用itertools.product
然后过滤:
list(product([0, 1, 2, 3], repeat=3))
... 或者可能使用 pandas
(虽然看起来有点矫枉过正)。
谢谢
我发现了一个超级丑陋的方法,可能需要优化(但至少它是有效的):
[
t for t in product(range(4), repeat=3)
if all(e==0 for e in t) or all(e==3 for e in t) or sum([e!=0 for e in t])==1
]
[编辑]
我找到了另一种使用 chain
和 product
构建列表的方法:
from itertools import chain, product
values = list(range(4)) # basically: [0, 1, 2, 3]
dflt = [values[0]] * 3 # basically: [0, 0, 0]
list(
chain(
[tuple([values[0]] * 3)],
(tuple(dflt[:i] + [v] + dflt[i + 1 :]) for i, v in product(range(3), values[1:])),
[tuple([values[-1]] * 3)],
)
)
结果如下:
[(0, 0, 0),
(1, 0, 0),
(2, 0, 0),
(3, 0, 0),
(0, 1, 0),
(0, 2, 0),
(0, 3, 0),
(0, 0, 1),
(0, 0, 2),
(0, 0, 3),
(3, 3, 3)]
你可以理解这个列表
for x in [ (a,b,c)
for a in range(4)
for b in range(4)
for c in range(4)
if a+b == 0
or b+c == 0
or a+c == 0
or a+b+c == 9
]: print(x)