2015-10-29 2 views
1

Я пишу код, который должен переходить reg_lines и создавать все перестановки для (1), какие строки использовать с каждым протоколом, и (2) какие строки отключить, чтобы проверить некоторые функции ,Создать перестановки вложенного dict

reg_lines = {'primary': ['ETH', 'UDP', 'TCP'], 'secondary': ['ETH', 'TCP'], private': ['UDP', 'TCP']} 

Ожидаемые перестановками:

1.

use = [{'primary':'ETH'}] 
disc = [{'primary':'ETH'}] 

2.

use = [{'primary: 'TCP'}] 
disc = [{'primary: 'TCP'}] 

...

дж.

use = [{'secondary: 'TCP'}] 
disc = [{'secondary: 'TCP'}] 

...

я.

use = [{'primary': 'ETH', 'secondary': 'ETH'} 
disc = [{'primary': 'ETH'}] 

i + 1.

use = [{'primary': 'ETH', 'secondary': 'ETH'}] 
disc = [{'primary': 'ETH'}] 

i + 2.

use = [{'primary': 'ETH', 'secondary': 'ETH'}] 
disc = [{'primary': 'ETH', 'secondary': 'ETH'}] 

...

н.

use = [{'primary': 'TCP', 'secondary': 'TCP', 'private': 'TCP}] 
disc = [{'primary': 'TCP', 'secondary': 'TCP', 'private': 'TCP}] 
+0

Пробовал играть с itertools.combinations, но я придумать что-то действительно грязный. – alnet

+0

Мне не понятно, где 'priv_lines' с момента' reg_lines' – SIslam

+0

@SIslam, вы правы. Я упростил вопрос. Удалено priv_lines. – alnet

ответ

1

Во-первых, использовать itertools.combinations, чтобы получить все комбинации первичного, вторичного и частного, а затем itertools.product, чтобы получить продукт из них. Затем снова используйте itertools.combinations, чтобы получить все подмножества для словарей disc.

from itertools import product, combinations, chain 

reg_lines = {'primary': ['ETH', 'UDP', 'TCP'], 'secondary': ['ETH', 'TCP'], 'private': ['UDP', 'TCP']} 

def all_combinations(lst): 
    return chain(*[combinations(lst, i+1) for i in range(len(lst))]) 

for comb in all_combinations(reg_lines): 
    for prod in product(*(reg_lines[k] for k in comb)): 
     use = dict(zip(comb, prod)) 
     print("use", use) 
     for comb2 in all_combinations(comb): 
      disc = {k: use[k] for k in comb2} 
      print("disc", disc) 

Выход:

use {'primary': 'ETH'} 
disc {'primary': 'ETH'} 
use {'primary': 'UDP'} 
disc {'primary': 'UDP'} 
... many many more ... 
use {'primary': 'TCP', 'secondary': 'TCP', 'private': 'TCP'} 
disc {'primary': 'TCP'} 
disc {'secondary': 'TCP'} 
disc {'private': 'TCP'} 
disc {'primary': 'TCP', 'secondary': 'TCP'} 
disc {'primary': 'TCP', 'private': 'TCP'} 
disc {'secondary': 'TCP', 'private': 'TCP'} 
disc {'primary': 'TCP', 'secondary': 'TCP', 'private': 'TCP'} 
+0

В вашем примере вы не получаете перестановки только для «вторичных» или «вторичных» + «частных» (use = dict (zip ((«primary», «secondary», «private»), x))) – alnet

+0

@ alnet Да, эта часть была немного неясной в вопросе ИМХО. Как насчет сейчас? –