如何获取字典值为列表的笛卡尔积?

8

我有一个字典:

mydict = {'item1':[1,2,3],'item2':[10,20,30]}

我希望创建两个元素的笛卡尔积,从而获得每对可能组合的元组。
output: [(1,10),(1,20),(1,30),
         (2,10),(2,20),(2,30),
         (3,10),(3,20),(3,30)]

看起来应该有一种简单的方法来做到这一点,以便如果我有三个项目,它就会扩展。 有点像动态循环次数。感觉我错过了一个明显的方法来做到这一点...

4个回答

13

itertools.product()函数将会完成这个操作:

>>> import itertools
>>> mydict = {'item1':[1,2,3],'item2':[10,20,30]}
>>> list(itertools.product(*mydict.values()))
[(10, 1), (10, 2), (10, 3), (20, 1), (20, 2), (20, 3), (30, 1), (30, 2), (30, 3)]

如果您需要控制结果元素的顺序,可以执行

itertools.product(mydict['item1'], mydict['item2'])

2
你可以使用两个循环来进行暴力破解。
mydict = {'item1':[1,2,3],'item2':[10,20,30]}

x = []
for i in mydict['item1']:
    for j in mydict['item2']:
        x.append((i,j))

这段代码做的事情就是遍历mydict['item1']中的所有项目,然后遍历mydict['item2']中的每个项目,并将每对项目追加到一个新列表中。

它将给您以下结果:

[(1, 10), (1, 20), (1, 30), (2, 10), (2, 20), (2, 30), (3, 10), (3, 20), (3, 30)]

1
你可以使用 列表推导式
[(i, j) for i in mydict['item1'] for j in mydict['item2']]

0
你可以使用两个for循环。 - 第一个循环将跟踪第一个列表项的索引位置。 - 第二个循环将遍历第二个列表中的每个项目。 - 在它运行完所有项目之后,第一个循环将增加到其列表中的下一个项目,第二个循环将再次遍历第二个列表,以此类推。

这正是我在我的回答中所做的。 - michaelpri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接