2013-06-11 19 views
5

Załóżmy, mam listęogóle możliwe połączenie faza

1,1

i może potrwać + lub - znak. Tak więc możliwe byłoby połączenie 2 do potęgi 2.

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

Podobnie, mam listę

1,1,1

i może potrwać + lub - znak. Tak więc możliwe byłoby połączenie 2 do potęgi 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 

W Pythonie w jaki sposób można to zrobić za pomocą itertools lub innych metod. Proszę o pomoc.

Odpowiedz

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

dlaczego krok 'zip'? –

+0

@AshwiniChaudhary, Co jeśli lst = [1,2,3]? – falsetru

+0

@AshwiniChaudhary, jeśli lista zawiera tylko 1s, nie ma potrzeby zip(). – falsetru

1

można zrobić:

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)] 

Takie podejście daje również taki sam wynik z permutations.

+0

dzięki za odpowiedź. to również daje pożądaną wydajność. – user2095624

0

chciałem spróbować rozwiązanie bez importu:

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) 

Wyjścia:

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

Jak zabawa.

Powiązane problemy