Search code examples
pythonpython-itertools

How to get all combinations from a given dictionary?


How to get all combinations (listed) from a given dictionary, in python ?

My input:

my_dict = {"location_01":"Item_01", "location_02":"Item_02", "location_03":"Item_03"}

Desidered output:

[{"location_01": "Item_01", "location_02": "Item_02", "location_03": "Item_03"},
 {"location_01": "Item_02", "location_02": "Item_01", "location_03": "Item_03"},
 {"location_01": "Item_03", "location_02": "Item_02", "location_03": "Item_01"},
 {"location_02": "Item_01", "location_01": "Item_02", "location_03": "Item_03"},
 {"location_02": "Item_02", "location_01": "Item_01", "location_03": "Item_03"},
 {"location_02": "Item_03", "location_01": "Item_02", "location_03": "Item_01"},
 {"location_03": "Item_01", "location_02": "Item_02", "location_01": "Item_03"},
 {"location_03": "Item_02", "location_02": "Item_01", "location_01": "Item_02"},
 {"location_03": "Item_03", "location_02": "Item_02", "location_01": "Item_01"}]

Solution

  • You're right in thinking of itertools but you want permutations and not combinations:

    from itertools import permutations
    lst = [{k: my_dict[k] for k in l} for l in permutations(my_dict)]
    
    >>> lst
    [{'location_01': 'Item_01', 'location_02': 'Item_02', 'location_03': 'Item_03'},
     {'location_01': 'Item_01', 'location_03': 'Item_03', 'location_02': 'Item_02'},
     {'location_02': 'Item_02', 'location_01': 'Item_01', 'location_03': 'Item_03'},
     {'location_02': 'Item_02', 'location_03': 'Item_03', 'location_01': 'Item_01'},
     {'location_03': 'Item_03', 'location_01': 'Item_01', 'location_02': 'Item_02'},
     {'location_03': 'Item_03', 'location_02': 'Item_02', 'location_01': 'Item_01'}]
    

    Edit:

    If you instead want the permutations of all values so your resulting dictionaries are all different, use:

    lst = [{k:v for k, v in zip(my_dict, vals)} for vals in permutations(my_dict.values())]
    
    >>> lst
    [{'location_01': 'Item_01', 'location_02': 'Item_02', 'location_03': 'Item_03'},
     {'location_01': 'Item_01', 'location_02': 'Item_03', 'location_03': 'Item_02'},
     {'location_01': 'Item_02', 'location_02': 'Item_01', 'location_03': 'Item_03'},
     {'location_01': 'Item_02', 'location_02': 'Item_03', 'location_03': 'Item_01'},
     {'location_01': 'Item_03', 'location_02': 'Item_01', 'location_03': 'Item_02'},
     {'location_01': 'Item_03', 'location_02': 'Item_02', 'location_03': 'Item_01'}]