列表乘法

时间:2010-01-30 23:03:38

标签: python list cartesian-product

我有一个列表L = [a,b,c],我想生成一个元组列表:

[(a,a), (a,b), (a,c), (b,a), (b,b), (b,c)...] 

我尝试过做L * L但是没有用。有人能告诉我如何在python中得到它。

7 个答案:

答案 0 :(得分:22)

你可以用列表理解来做到这一点:

[ (x,y) for x in L for y in L]

修改

您也可以像其他人建议的那样使用itertools.product,但前提是您使用2.6以上版本。列表理解将适用于2.0的所有Python版本。如果你确实使用了itertools.product,请记住它返回一个生成器而不是列表,所以你可能需要转换它(取决于你想用它做什么)。

答案 1 :(得分:13)

itertools模块包含许多有用的功能。看起来您可能正在寻找product

>>> import itertools
>>> L = [1,2,3]
>>> itertools.product(L,L)
<itertools.product object at 0x83788>
>>> list(_)
[(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

答案 2 :(得分:7)

查看itertools模块,该模块提供product成员。

L =[1,2,3]

import itertools
res = list(itertools.product(L,L))
print(res)

给出:

[(1,1),(1,2),(1,3),(2,1), ....  and so on]

答案 3 :(得分:3)

两个主要选择:

>>> L = ['a', 'b', 'c']
>>> import itertools
>>> list(itertools.product(L, L))
[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')]
>>> [(one, two) for one in L for two in L]
[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')]
>>> 

前者需要Python 2.6或更高版本 - 后者适用于您可能绑定的任何Python版本。

答案 4 :(得分:0)

x = [a,b,c] y = [] 对于x中的项目:  对于x中的item2:   y.append((item,item2))

也许不是Pythonic的方式而是工作

答案 5 :(得分:0)

好的我试过了:

L2 = [(x,y),对于x中的x,对于L中的x],这得到L平方。

这是最好的pythonic方式吗?我希望L * L能在python中运行。

答案 6 :(得分:0)

最老式的做法是:

def perm(L):
    result = []
    for i in L:
        for j in L:
            result.append((i,j))
    return result

它的运行时间为O(n ^ 2),因此非常慢,但您可以将其视为“复古”样式代码。