Bạn có thể sử dụng itertools.product(..)
nhưng chỉ định repeat
là repeat=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.