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

Python: Combination in lists of lists (?)

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

我现在基本上是两个以列表为元素的列表。 示例:

List1 = [ [a,b], [c,d,e], [f] ]
List2 = [ [g,h,i], [j], [k,l] ]

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

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

[a,b] -> [g,h,i]

但是,我想要 assingments/edges 个独特的元素,所以我需要:

[a] -> [g]
[a] -> [h]
[a] -> [i]
[b] -> [g]
[b] -> [h]
[b] -> [i]

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

List3 = [ [a,g], [a,h], [a,i], [b,g], ...]

有什么优雅的方法可以从 List1 和 List2 到 List 3 吗?

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

您可以 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')]
import itertools
k = []
for a,b in zip(List1,List2):
    for j in itertools.product(a,b):
        k.append(j)
print k

如果你不想使用 itertools,你也可以使用 list comprehensions in combination with zip 来相当优雅地做到这一点:

lst1 = [['a','b'], ['c','d','e'], ['f']]
lst2 = [['g','h','i'], ['j'], ['k','l']]
edges = [[x, y] for il1, il2 in zip(lst1, lst2) for x in il1 for y in il2]