2014-06-14 2 views
2
for item1 in dict[1]: 
    for item2 in dict[2]: 
    for item3 in dict[3]: 
     and so on 

dict에는 n 개의 키가 있다고 가정 해 봅시다. 하나의 라이너로 itertools를 사용하여 한 번에 n 개의 항목을 생성하는 방법이 있습니까?많은 반복문에서 모든 조합을 반복합니다.

다른 말로하면 위의 코드를 itertools에서 복제 할 수 있습니까?

답변

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} 
+0

콤보 (값)와 해당 키를 동시에 가져올 수 있습니까? – KaliMa

+0

@KaliMa : 키는 값과 같은 순서로 주어집니다 :'somedict.keys()'는 값의 순서와 일치합니다. –

관련 문제