2017-03-06 19 views
7

Tôi có hai danh sách:kết hợp của hai danh sách (không phải yếu tố khôn ngoan)

a = ['a', 'b'] 
b = [1, 2, 3] 

Tôi muốn có được sự kết hợp sản xuất giữa các yếu tố của danh sách b và các yếu tố của danh sách một nhưng các yếu tố điều trị của a như các cặp (hoặc bộ ba, vv ..) làm ví dụ bên dưới:

Điều này thực sự cung cấp số kết hợp len(b) ** len(a).

c = ["a_1 b_1", "a_1 b_2", "a_1 b_3", "a_2 b_1", "a_2 b_2", "a_2 b_3", "a_3 b_1", "a_3 b_2" "a_3 b_3"] 

Tôi đã cố gắng sử dụng itertools.product (như mô tả here) nhưng điều này sẽ cung cấp cho chỉ 6 kết hợp có thể.

Trả lời

14

Bạn có thể sử dụng itertools.product(..) nhưng chỉ định repeatrepeat=len(a). Vì vậy, bạn có thể sử dụng:

from itertools import product 

def mul_product(a,b): 
    for tup in product(b,repeat=len(a)): 
     yield ' '.join('%s_%s'%t for t in zip(a,tup)) 

Các product(..) sẽ tạo ra các bộ như:

>>> list(product(b,repeat=len(a))) 
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)] 

Vì vậy, đây là yếu tố đầu tiên của tuple là một trong đó là gắn liền với a_, điều thứ hai để b_. Bây giờ chúng ta zip(..) chúng lại với nhau với danh sách a, sản xuất:

>>> list(map(lambda bi:list(zip(a,bi)),product(b,repeat=len(a)))) 
[[('a', 1), ('b', 1)], [('a', 1), ('b', 2)], [('a', 1), ('b', 3)], [('a', 2), ('b', 1)], [('a', 2), ('b', 2)], [('a', 2), ('b', 3)], [('a', 3), ('b', 1)], [('a', 3), ('b', 2)], [('a', 3), ('b', 3)]] 

Bây giờ nó chỉ là một vấn đề định dạng ('%s_%s'%t), và ' '.join(..) ining chúng lại với nhau và yield họ (hoặc bạn có thể sử dụng danh sách hiểu biết để tạo ra một danh sách).

Kết quả cho đầu vào mẫu của bạn là:

>>> list(mul_product(a,b)) 
['a_1 b_1', 'a_1 b_2', 'a_1 b_3', 'a_2 b_1', 'a_2 b_2', 'a_2 b_3', 'a_3 b_1', 'a_3 b_2', 'a_3 b_3'] 

Lưu ý rằng các yếu tố ở đây được tạo ra một cách lười biếng. Điều này có thể hữu ích nếu bạn là ví dụ chỉ quan tâm đến những người đầu tiên k những người thân, hoặc khi bạn không muốn tạo ra tất cả chúng cùng một lúc.

4

Bạn có thể tạo ra một cách rõ ràng mục cặp bạn sử dụng itertools.product, sau đó hoạt động trên những cặp lại với itertools.product

import itertools 
a = ['a', 'b'] 
b = [1, 2, 3] 
pairs = [list(itertools.product([ai], b)) for ai in a] 

pairs sẽ chứa hai danh sách có thể đưa vào itertools.product một lần nữa.

list(itertools.product(*pairs)) 

Kết quả là:

[(('a', 1), ('b', 1)), 
(('a', 1), ('b', 2)), 
(('a', 1), ('b', 3)), 
(('a', 2), ('b', 1)), 
(('a', 2), ('b', 2)), 
(('a', 2), ('b', 3)), 
(('a', 3), ('b', 1)), 
(('a', 3), ('b', 2)), 
(('a', 3), ('b', 3))] 
Các vấn đề liên quan