2013-06-11 26 views
5

Supponiamo, ho una lista ditutte le possibili combinazioni di fase

1,1

e si può prendere o segno + o -. Quindi la combinazione possibile sarebbe 2 alla potenza 2.

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

Allo stesso modo, ho una lista di

1,1,1

e si può prendere o + o - cartello. Quindi la combinazione possibile sarebbe 2 alla potenza 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 

in Python, come posso farlo utilizzando itertools o qualsiasi altro metodo. Qualsiasi aiuto per favore.

risposta

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

perché il passaggio 'zip'? –

+0

@AshwiniChaudhary, Cosa succede se lst = [1,2,3]? – falsetru

+0

@AshwiniChaudhary, se l'elenco contiene solo 1s, non è necessario eseguire il zip(). – falsetru

1

Si può fare:

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

Questo approccio dà anche lo stesso risultato con permutations.

+0

grazie per la tua risposta. questo dà anche l'output desiderato. – user2095624

0

ho deciso di provare una soluzione senza le importazioni:

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) 

Uscite:

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

Come divertente.

Problemi correlati