5

假设,我有一个列表

1,1

它可以采用 + 或 - 号。所以可能的组合是 2 的 2 次方。

 1  1
 1 -1
-1  1
-1 -1

同样,我有一个列表

1,1,1

它可以采用 + 或 - 号。所以可能的组合是 2 的 3 次方。

-1   1  -1
-1   1   1
 1   1   1
 1  -1   1
-1  -1  -1
 1   1  -1
 1  -1  -1
-1  -1   1

在 python 中,我该如何使用 itertools 或任何其他方法来做到这一点。请提供任何帮助。

4

3 回答 3

10
>>> import itertools
>>> lst = [1,1,1]
>>> for xs in itertools.product([1,-1], repeat=len(lst)):
...     print([a*b for a,b in zip(lst, xs)])
... 
[1, 1, 1]
[1, 1, -1]
[1, -1, 1]
[1, -1, -1]
[-1, 1, 1]
[-1, 1, -1]
[-1, -1, 1]
[-1, -1, -1]
于 2013-06-11T06:56:43.237 回答
1

你可以做:

from itertools import combinations
size = 3
ans = list(set(combinations([-1,1]*size,size)))
#[(1, 1, -1),
# (-1, 1, 1),
# (-1, -1, 1),
# (1, -1, -1),
# (1, -1, 1),
# (-1, 1, -1),
# (1, 1, 1),
# (-1, -1, -1)]

这种方法也给出了与 相同的结果permutations

于 2013-06-11T07:00:21.717 回答
0

我想尝试一个没有进口的解决方案:

list_input = [1,1,1,1,1]
permutations = 2**len(list_input)
for p in range(permutations):
    if p: # if not first iteration
        mod = 1
        for k, v in enumerate(list_input):
            mod = mod/2.0 # needs to use modulus in steps
            if not p % (permutations * mod):
                list_input[k] *= -1
    print(list_input)

输出:

[1, 1, 1, 1, 1]
[1, 1, 1, 1, -1]
[1, 1, 1, -1, 1]
[1, 1, 1, -1, -1]
[1, 1, -1, 1, 1]
[1, 1, -1, 1, -1]
[1, 1, -1, -1, 1]
[1, 1, -1, -1, -1]
[1, -1, 1, 1, 1]
[1, -1, 1, 1, -1]
[1, -1, 1, -1, 1]
[1, -1, 1, -1, -1]
[1, -1, -1, 1, 1]
[1, -1, -1, 1, -1]
[1, -1, -1, -1, 1]
[1, -1, -1, -1, -1]
[-1, 1, 1, 1, 1]
[-1, 1, 1, 1, -1]
[-1, 1, 1, -1, 1]
[-1, 1, 1, -1, -1]
[-1, 1, -1, 1, 1]
[-1, 1, -1, 1, -1]
[-1, 1, -1, -1, 1]
[-1, 1, -1, -1, -1]
[-1, -1, 1, 1, 1]
[-1, -1, 1, 1, -1]
[-1, -1, 1, -1, 1]
[-1, -1, 1, -1, -1]
[-1, -1, -1, 1, 1]
[-1, -1, -1, 1, -1]
[-1, -1, -1, -1, 1]
[-1, -1, -1, -1, -1]

多么有趣。

于 2013-06-11T08:23:48.393 回答