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

时间:2015-05-18 12:18:35

标签: python list graph vertices edges

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

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

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

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

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

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

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

[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?

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

3 个答案:

答案 0 :(得分: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')]

答案 1 :(得分:2)

如果您不想使用itertools,您还可以将list comprehensionszip结合使用来相当优雅地执行此操作:

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]

答案 2 :(得分:0)

import itertools
k = []
for a,b in zip(List1,List2):
    for j in itertools.product(a,b):
        k.append(j)
print k