您可以使用itertools.product(..),但将repeat 指定为repeat=len(a)。所以你可以使用:
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))
product(..) 将生成如下元组:
>>> list(product(b,repeat=len(a)))
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]
所以这里元组的第一个元素是附加到a_ 的那个,第二个是附加到b_ 的。现在我们将zip(..) 它们与a 列表一起生成:
>>> 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)]]
现在只需要格式化 ('%s_%s'%t) 和 ' '.join(..)ining 它们在一起和 yield 它们(或者您可以使用列表解析来生成列表)。
您的示例输入的结果是:
>>> 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']
注意这里的元素是惰性生成的。例如,如果您只对第一个 k 感兴趣,或者不想一次生成所有这些,这将很有用。