遍历许多迭代中的所有组合

时间:2014-06-14 22:20:14

标签: python itertools

for item1 in dict[1]:
   for item2 in dict[2]:
     for item3 in dict[3]:
        and so on

假设dict中有n个键。有没有办法使用itertools一次生成n个项目?

换句话说,我可以用itertools中的东西复制上面的代码吗?

1 个答案:

答案 0 :(得分:3)

使用itertools.product()

from itertools import product

for combo in product(*somedict.values()):

请注意,值以当前字典顺序返回,这是任意的。如果您需要特定的密钥订购,则需要提供该订单:

keys = ('foo', 'bar', 'baz')
for combo in product(*(somedict[k] for k in keys)):

如果您想要再次使用相同密钥的字典,请使用zip()

for combo in product(*somedict.values()):
    newdict = dict(zip(somedict.keys(), combo))

演示:

>>> from itertools import product
>>> somedict = {'foo': [1, 2], 'bar': ['a', 'b', 'c'], 'baz': [42, 81]}
>>> for combo in product(*somedict.values()):
...     print combo
... 
(42, 1, 'a')
(42, 1, 'b')
(42, 1, 'c')
(42, 2, 'a')
(42, 2, 'b')
(42, 2, 'c')
(81, 1, 'a')
(81, 1, 'b')
(81, 1, 'c')
(81, 2, 'a')
(81, 2, 'b')
(81, 2, 'c')
>>> for combo in product(*somedict.values()):
...     print dict(zip(somedict.keys(), combo))
... 
{'bar': 'a', 'foo': 1, 'baz': 42}
{'bar': 'b', 'foo': 1, 'baz': 42}
{'bar': 'c', 'foo': 1, 'baz': 42}
{'bar': 'a', 'foo': 2, 'baz': 42}
{'bar': 'b', 'foo': 2, 'baz': 42}
{'bar': 'c', 'foo': 2, 'baz': 42}
{'bar': 'a', 'foo': 1, 'baz': 81}
{'bar': 'b', 'foo': 1, 'baz': 81}
{'bar': 'c', 'foo': 1, 'baz': 81}
{'bar': 'a', 'foo': 2, 'baz': 81}
{'bar': 'b', 'foo': 2, 'baz': 81}
{'bar': 'c', 'foo': 2, 'baz': 81}