Sky Scraper
Sky Scraper

Reputation: 39

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"}]

Upvotes: 0

Views: 99

Answers (2)

not_speshal
not_speshal

Reputation: 23166

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'}]

Upvotes: 2

user15801675
user15801675

Reputation:

Try permutations

import itertools
d={"location_01":"Item_01", "location_02":"Item_02", "location_03":"Item_03"}
x=[dict(zip(d, v)) for v in itertools.permutations(d.values(),3)]
for i in x:
    print(i)

Upvotes: 0

Related Questions