Python 中的部分 itertools.product

问题描述 投票:0回答:2

我想根据可能值的列表在 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]
    ) 的每个值设置为 0
  • 元组所有元素的最后一个值 (
    3
    )

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

我首先想到使用

itertools.product
然后过滤:

list(product([0, 1, 2, 3], repeat=3))

...或者也许可以使用

pandas
(虽然看起来有点过分)。

python combinations python-itertools
2个回答
0
投票

你可以理解这个列表

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
投票

我发现了一个超级丑陋的方法,可能需要优化(但至少它有效):

[
 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)]
© www.soinside.com 2019 - 2024. All rights reserved.