所有可能的相位组合

时间:2013-06-11 06:53:36

标签: python

假设我有一个

列表
  

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或任何其他方法来做到这一点。请帮忙。

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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得出相同的结果。

答案 2 :(得分: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]

多么有趣。