2017-03-06 78 views
1

我有一個字典,其中每個值都是列表的列表。我想遍歷字典值的所有可能組合

喜歡的東西:

sites = {'e1': [[0, 1, 3], [0, 2, 3]], 'e2': [[0, 1, 4], [0, 3, 4]]} 

我想通過所有可能的組合列表(在我的例子,即對)(即一個的e2e1 +一個名單列表等)循環。

與例如更好:

我想遍歷所有這些組合:

[0, 1, 3]; [0, 1, 4] 
[0, 1, 3]; [0, 3, 4] 
[0, 2, 3]; [0, 1, 4] 
[0, 2, 3]; [0, 3, 4] 

此例詞典有兩個密鑰但在實踐中,我不知道有多少鍵會在我的字典。它可能超過兩個。

你能幫忙嗎?

+1

請參閱下文; 'itertools.product(* sites.values())'會做到這一點。 –

+0

或'list(reduce(product,sites.values()))' –

+0

取決於您是否想要獲得2元組或n元組(對於dict中的n個條目)。 'itertools.product'將產生n元組。使用'itertools.combinations'你可以指定元組的長度。 –

回答

2

您正在查找的笛卡爾積之間列表字典的值。爲了達到預期的效果,您可以使用itertools.product作爲:

>>> from itertools import product 
>>> sites = {'e1': [[0, 1, 3], [0, 2, 3]], 'e2': [[0, 1, 4], [0, 3, 4]]} 

>>> list(product(*sites.values())) 
[([0, 1, 3], [0, 1, 4]), 
([0, 1, 3], [0, 3, 4]), 
([0, 2, 3], [0, 1, 4]), 
([0, 2, 3], [0, 3, 4])]