我想根据可能值的列表在 Python 中创建以下元组列表
[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]
) 的每个值设置为 03
)什么是有效的方法? ...也许有一个神奇的功能可以做到这一点?
我首先想到使用
itertools.product
然后过滤:
list(product([0, 1, 2, 3], repeat=3))
...或者也许可以使用
pandas
(虽然看起来有点过分)。
你可以理解这个列表
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)
我发现了一个超级丑陋的方法,可能需要优化(但至少它有效):
[
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)]