给定长度为M和N的列表,如何获得具有所有可能对的长度M * N的列表

时间:2016-07-15 12:01:59

标签: python

假设我们有两个列表ab

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

是否有快速操作会返回元组列表[(1,3), (1,4), (2,3), (2,4)]

3 个答案:

答案 0 :(得分:2)

列表理解是这样的:

[(i,j) for i in a for j in b]

<强>输出:

>>> a = [1, 2]
>>> b = [3, 4]
>>> [(i,j)  for i in a for j in b]
[(1, 3), (1, 4), (2, 3), (2, 4)]

答案 1 :(得分:2)

您还可以使用itertools.product

list(itertools.product(a, b))

如果您有多个列表或可变数量的列表,这将非常有用。

例如:

>>> import itertools
>>> a = [1, 2]
>>> b = [3, 4]
>>> c = [5, 6]
>>> list(itertools.product(a, b, c))
[(1, 3, 5), (1, 3, 6), (1, 4, 5), (1, 4, 6), (2, 3, 5), (2, 3, 6), (2, 4, 5), (2, 4, 6)]

答案 2 :(得分:2)

函数itertools.product()将起到作用:

In [41]: a, b = [1, 2], [3, 4]

In [42]: from itertools import product

In [43]: list(product(a, b))
Out[43]: [(1, 3), (1, 4), (2, 3), (2, 4)]

需要指出的是,需要调用内置函数list()product返回的迭代器转换为列表。

作为旁注,如果您的目标是使用自身计算列表的产品,您可能会发现使用可选的repeat关键字参数很方便:

In [46]: list(product(a, repeat=3))
Out[46]: 
[(1, 1, 1),
 (1, 1, 2),
 (1, 2, 1),
 (1, 2, 2),
 (2, 1, 1),
 (2, 1, 2),
 (2, 2, 1),
 (2, 2, 2)]