Finding All possible items combination dictionary Using Python

When working with Python, you may frequently encounter scenarios that require generating all possible combinations of items from a given dictionary. This task holds significance in various fields such as data analysis, machine learning, optimization, and combinatorial problems. In this article, we will explore different approaches to efficiently find all possible item combinations using Python.

Suppose we have a dictionary where the keys represent distinct items, and the values associated with each key denote their respective properties or attributes. Our objective is to generate all possible combinations of properties, selecting one property from each item.

Problem Example

Consider the following input dictionary

items = {
    'item1': ['property1', 'property2'],
    'item2': ['property3'],
    'item3': ['property4', 'property5', 'property6']
}
print("Input dictionary:")
print(items)
Input dictionary:
{'item1': ['property1', 'property2'], 'item2': ['property3'], 'item3': ['property4', 'property5', 'property6']}

The desired output would generate all combinations by selecting one property from each item

# Expected combinations:
# ('property1', 'property3', 'property4')
# ('property1', 'property3', 'property5')
# ('property1', 'property3', 'property6')
# ('property2', 'property3', 'property4')
# ('property2', 'property3', 'property5')
# ('property2', 'property3', 'property6')

Using itertools.product

The most efficient approach utilizes the product function from Python's itertools module. This function generates the Cartesian product of input iterables, which perfectly suits our requirements

import itertools

def find_all_combinations(items):
    values = list(items.values())
    combinations = []
    
    for combination in itertools.product(*values):
        combinations.append(combination)
    
    return combinations

# Example usage
items = {
    'item1': ['property1', 'property2'],
    'item2': ['property3'],
    'item3': ['property4', 'property5', 'property6']
}

combinations = find_all_combinations(items)
print("All combinations:")
for combo in combinations:
    print(combo)
All combinations:
('property1', 'property3', 'property4')
('property1', 'property3', 'property5')
('property1', 'property3', 'property6')
('property2', 'property3', 'property4')
('property2', 'property3', 'property5')
('property2', 'property3', 'property6')

Using Recursive Approach

Another viable approach involves utilizing a recursive function. This method proves particularly useful for understanding the underlying logic

def find_combinations_recursive(items):
    keys = list(items.keys())
    values = list(items.values())
    combinations = []

    def generate_combinations(current_index, current_combination):
        if current_index == len(keys):
            combinations.append(tuple(current_combination))
            return

        for value in values[current_index]:
            generate_combinations(current_index + 1, current_combination + [value])

    generate_combinations(0, [])
    return combinations

# Example usage
items = {
    'item1': ['property1', 'property2'],
    'item2': ['property3'],
    'item3': ['property4', 'property5', 'property6']
}

combinations = find_combinations_recursive(items)
print("Recursive approach result:")
for combo in combinations:
    print(combo)
Recursive approach result:
('property1', 'property3', 'property4')
('property1', 'property3', 'property5')
('property1', 'property3', 'property6')
('property2', 'property3', 'property4')
('property2', 'property3', 'property5')
('property2', 'property3', 'property6')

Creating Dictionary Output

If you need the result as a dictionary with item keys as dictionary keys

import itertools

def find_combinations_as_dict(items):
    keys = tuple(items.keys())
    values = list(items.values())
    combinations_dict = {}

    for i, combination in enumerate(itertools.product(*values)):
        combinations_dict[f"combination_{i+1}"] = dict(zip(keys, combination))

    return combinations_dict

# Example usage
items = {
    'item1': ['property1', 'property2'],
    'item2': ['property3'],
    'item3': ['property4', 'property5', 'property6']
}

result = find_combinations_as_dict(items)
print("Dictionary format result:")
for key, value in result.items():
    print(f"{key}: {value}")
Dictionary format result:
combination_1: {'item1': 'property1', 'item2': 'property3', 'item3': 'property4'}
combination_2: {'item1': 'property1', 'item2': 'property3', 'item3': 'property5'}
combination_3: {'item1': 'property1', 'item2': 'property3', 'item3': 'property6'}
combination_4: {'item1': 'property2', 'item2': 'property3', 'item3': 'property4'}
combination_5: {'item1': 'property2', 'item2': 'property3', 'item3': 'property5'}
combination_6: {'item1': 'property2', 'item2': 'property3', 'item3': 'property6'}

Comparison

Method Time Complexity Space Complexity Best For
itertools.product O(N×M) O(N×M) Large datasets, efficiency
Recursive O(N^M) O(N×M) Understanding logic, small datasets

Where N is the number of keys and M is the average number of values per key.

Conclusion

Use itertools.product for efficient generation of all possible combinations from dictionary values. The recursive approach helps understand the underlying logic but is less efficient for large datasets. Both methods provide complete solutions for finding all possible item combinations in Python dictionaries.

Updated on: 2026-03-27T12:36:00+05:30

446 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements