Creating cartesian product for n different types

前端 未结 2 2051
孤城傲影
孤城傲影 2020-12-21 01:14

Consider I have a dict holding n different types represented by keys:x1, x2 ..xn

For simplicity let\'s take a small example:

{\"x1\":[\"         


        
2条回答
  •  囚心锁ツ
    2020-12-21 01:55

    You can use itertools.product to get the cartesian product. To reconstruct the key-value pairs for the new dicts, you can first freeze the order of keys (.keys and .values ordering is not guaranteed across all Python versions unless dict is not altered) by calling list on it before taking the cartesian product. The values from the cartesian product now maintain the order of the keys and the key-value pairs for the resulting dicts can now be safely constructed with zip:

    from itertools import product
    from pprint import pprint
    
    dct = {"x1":["foo1", "goo1" ,"doo1"], "x2":["foo2","goo2"]}
    
    keys = list(dct)
    lst = [dict(zip(keys, vals)) for vals in product(*[dct[k] for k in keys])]
    pprint(lst)
    

    [{'x1': 'foo1', 'x2': 'foo2'},
     {'x1': 'foo1', 'x2': 'goo2'},
     {'x1': 'goo1', 'x2': 'foo2'},
     {'x1': 'goo1', 'x2': 'goo2'},
     {'x1': 'doo1', 'x2': 'foo2'},
     {'x1': 'doo1', 'x2': 'goo2'}]
    

    This will scale to as many value lists as the original list contains.

提交回复
热议问题