我有两个清单:
a = ['a', 'b']
b = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
我想得到列表b元素和列表a元素之间产生的组合,但是a作为对(或三元组等)处理元素,如下面的例子给出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"]
Run Code Online (Sandbox Code Playgroud)
我曾尝试使用itertools.product(如描述在这里),但这将只给出6种可能的组合.
Wil*_*sem 14
您可以使用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))
Run Code Online (Sandbox Code Playgroud)
该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)]
Run Code Online (Sandbox Code Playgroud)
因此,这里的元组的第一个元素是连接到一个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)]]
Run Code Online (Sandbox Code Playgroud)
现在只需要格式化('%s_%s'%t),将' '.join(..)它们组合在一起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']
Run Code Online (Sandbox Code Playgroud)
请注意,这里的元素是懒惰生成的.如果您仅对第k一个感兴趣,或者您不想一次生成所有这些内容,则此功能非常有用.
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |