Python:列表列表中的组合(?)

use*_*943 5 python graph list vertices edges

首先,我想说我的标题可能没有正确描述我的问题.我不知道如何调用我想要完成的过程,这使得在stackoverflow或google上搜索解决方案非常困难.关于这一点的暗示可能已经帮助了我很多!

我目前拥有的基本上是两个列表作为元素列表.例:

List1 = [ [a,b], [c,d,e], [f] ]
List2 = [ [g,h,i], [j], [k,l] ]
Run Code Online (Sandbox Code Playgroud)

这些列表基本上是我试图在我的项目中创建的图形的顶点,其中边缘应该是按行从List1到List2.

如果我们查看每个列表的第一行,我就有:

[a,b] -> [g,h,i]
Run Code Online (Sandbox Code Playgroud)

但是,我希望有独特元素的辅助/边缘,所以我需要:

[a] -> [g]
[a] -> [h]
[a] -> [i]
[b] -> [g]
[b] -> [h]
[b] -> [i]
Run Code Online (Sandbox Code Playgroud)

我想要的结果是另一个列表,这些独特的分配作为元素,即

List3 = [ [a,g], [a,h], [a,i], [b,g], ...]
Run Code Online (Sandbox Code Playgroud)

是否有任何优雅的方式从List1和List2到列表3?

我想要实现的方法是逐行,确定每行的元素数量,然后编写子句和循环以创建一个包含所有可能组合的新列表.然而,这感觉是一种非常低效的方式.

Cor*_*mer 13

您可以zip使用两个列表,然后使用它们itertools.product来创建每个组合.您可以使用itertools.chain.from_iterable展平结果列表.

>>> import itertools
>>> List1 = [ ['a','b'], ['c','d','e'], ['f'] ]
>>> List2 = [ ['g','h','i'], ['j'], ['k','l'] ]
>>> list(itertools.chain.from_iterable(itertools.product(a,b) for a,b in zip(List1, List2)))
[('a', 'g'), ('a', 'h'), ('a', 'i'), ('b', 'g'), ('b', 'h'), ('b', 'i'), ('c', 'j'), ('d', 'j'), ('e', 'j'), ('f', 'k'), ('f', 'l')]
Run Code Online (Sandbox Code Playgroud)