2013-06-11 42 views
5

Giả sử, tôi có một danh sách cáctất cả các giai đoạn kết hợp có thể

1,1

và nó có thể mất một trong hai + hoặc - dấu. Vì vậy, sự kết hợp có thể sẽ là 2 với sức mạnh 2.

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

Tương tự như vậy, tôi có một danh sách các

1,1,1

và nó có thể mất một trong hai hoặc + - ký tên. Vì vậy, sự kết hợp có thể sẽ là 2 với sức mạnh 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 

Trong python, làm thế nào tôi có thể làm điều đó bằng itertools hoặc bất kỳ phương pháp khác. Xin vui lòng giúp đỡ.

Trả lời

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

lý do tại sao bước 'zip'? –

+0

@AshwiniChaudhary, Nếu lst = [1,2,3] thì sao? – falsetru

+0

@AshwiniChaudhary, Nếu danh sách chỉ chứa 1s, không cần phải nén(). – falsetru

1

Bạn có thể làm:

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

Cách tiếp cận này cũng cho kết quả tương tự với permutations.

+0

cảm ơn câu trả lời của bạn. điều này cũng cho đầu ra mong muốn. – user2095624

0

tôi muốn thử một giải pháp mà không nhập khẩu:

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) 

Đầu ra:

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

Làm thế nào vui vẻ.

Các vấn đề liên quan