循环列表中的每个项目

Loop for each item in a list

我有字典:

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)]

似乎有一种简单的方法可以做到这一点,如果我有三个项目,它就会扩展。有点像循环的动态数量。感觉我缺少一个明显的方法来做到这一点...

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'])

你也可以使用两个循环来暴力破解它

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)]

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

您可以使用 List Comprehensions:

[(i, j) for i in mydict['item1'] for j in mydict['item2']]