2013-06-11 15 views
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 или любых других методов. Любая помощь пожалуйста.

ответ

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] 
+0

Почему шаг 'zip'? –

+0

@AshwiniChaudhary, Что, если lst = [1,2,3]? – falsetru

+0

@AshwiniChaudhary, если список содержит только 1s, не нужно zip(). – falsetru

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.

+0

. это также дает желаемый результат. – user2095624

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] 

Как весело.

Смежные вопросы