Python中的成对交叉产品

99 python list

如何从Python中的任意长列表列表中获取交叉产品列表?

a = [1, 2, 3]
b = [4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

crossproduct(a,b)应该屈服[[1, 4], [1, 5], [1, 6], ...].

Chr*_*heD 140

如果您(至少)使用Python 2.6,那么您正在寻找itertools.product.

>>> import itertools
>>> a=[1,2,3]
>>> b=[4,5,6]
>>> itertools.product(a,b)
<itertools.product object at 0x10049b870>
>>> list(itertools.product(a,b))
[(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
Run Code Online (Sandbox Code Playgroud)

  • `product()`不限于两个参数,因此也可用于任意数量的列表(自己列出).所以你可以做`list(itertools.product(*[[1,2],[3,4],[5,6]]))`得到`[(1,3,5),(1,3 ,6),..` (9认同)
  • 请注意,对于2.6之前的使用,您只需从链接文档中复制并粘贴纯Python实现即可. (3认同)

Cor*_*sky 80

既然你要了一个清单:

[(x, y) for x in a for y in b]
Run Code Online (Sandbox Code Playgroud)

但是,如果您只是通过使用生成器来循环遍历列表,则可以避免列表的开销:

((x, y) for x in a for y in b)
Run Code Online (Sandbox Code Playgroud)

for循环中表现相同,但不会导致创建list.

  • 很好的pythonic.或者我喜欢说,这是pythontificocity的一个很好的例子. (6认同)
  • 显式总是优于隐式. (2认同)

Rab*_*eih 14

使用生成器不需要itertools,只需:

gen = ((x, y) for x in a for y in b)

for u, v in gen:
    print u, v
Run Code Online (Sandbox Code Playgroud)