首先,我想说我的标题可能没有正确描述我的问题。我不知道如何调用我想要完成的过程,这使得在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?
我想要实现的方法是逐行,确定每行的元素数量,然后编写子句和循环以创建一个包含所有组合的新列表。然而,这感觉就像是一种非常低效的方式。
答案 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 comprehensions与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]
答案 2 :(得分:0)
import itertools
k = []
for a,b in zip(List1,List2):
for j in itertools.product(a,b):
k.append(j)
print k