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

总结一下:

什么是有效的方法? ...也许有一个神奇的功能可以做到这一点?

我先想到的是用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
]

[编辑]

我找到了另一种使用 chainproduct 构建列表的方法:

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)