Aplicações Práticas de Combinações
Agora, vamos explorar algumas aplicações práticas da função itertools.combinations(). Implementaremos alguns exemplos do mundo real para demonstrar como essa função pode ser usada para resolver problemas comuns.
Imagine que você precisa formar equipes de um determinado tamanho a partir de um grupo de pessoas. Vamos criar um programa que ajude a formar todas as equipes possíveis.
-
Crie um novo arquivo chamado team_formation.py no diretório /home/labex/project.
-
Adicione o seguinte código:
import itertools
def form_teams(members, team_size):
"""Generate all possible teams of the specified size from the list of members."""
teams = list(itertools.combinations(members, team_size))
return teams
## List of team members
team_members = ["Alice", "Bob", "Charlie", "David", "Eva", "Frank"]
## Form teams of different sizes
pairs = form_teams(team_members, 2)
trios = form_teams(team_members, 3)
## Display the results
print(f"Total members: {len(team_members)}")
print(f"Members: {team_members}\n")
print(f"Possible pairs (teams of 2): {len(pairs)}")
for i, pair in enumerate(pairs, 1):
print(f"Team {i}: {' and '.join(pair)}")
print(f"\nPossible trios (teams of 3): {len(trios)}")
for i, trio in enumerate(trios, 1):
print(f"Team {i}: {', '.join(trio)}")
- Execute o script:
python3 team_formation.py
Você deve ver uma saída que lista todos os pares e trios possíveis que podem ser formados a partir dos seis membros da equipe.
Exemplo 2: Encontrando todos os Subconjuntos
Outra aplicação comum é gerar todos os subconjuntos possíveis de um determinado conjunto (também conhecido como conjunto das partes). Vamos implementar isso:
-
Crie um novo arquivo chamado generate_subsets.py no diretório /home/labex/project.
-
Adicione o seguinte código:
import itertools
def generate_all_subsets(items):
"""Generate all possible subsets of the given items."""
all_subsets = []
## Empty set is always a subset
all_subsets.append(())
## Generate subsets of all possible lengths
for r in range(1, len(items) + 1):
subsets_of_length_r = list(itertools.combinations(items, r))
all_subsets.extend(subsets_of_length_r)
return all_subsets
## Sample set of items
items = ['A', 'B', 'C']
## Generate all subsets
subsets = generate_all_subsets(items)
## Display the results
print(f"Original set: {items}")
print(f"Total number of subsets: {len(subsets)}")
print("All subsets (including the empty set):")
for i, subset in enumerate(subsets):
if len(subset) == 0:
print(f"{i+1}. Empty set {{}}")
else:
print(f"{i+1}. {set(subset)}")
- Execute o script:
python3 generate_subsets.py
A saída mostrará todos os subconjuntos possíveis do conjunto {A, B, C}, incluindo o conjunto vazio.
Vamos criar uma aplicação prática que ajuda um restaurante a gerar todas as combinações de refeições possíveis a partir de seus itens de menu:
-
Crie um novo arquivo chamado menu_combinations.py no diretório /home/labex/project.
-
Adicione o seguinte código:
import itertools
def generate_meal_combinations(appetizers, main_courses, desserts):
"""Generate all possible meal combinations with one item from each category."""
meal_combinations = []
for app in appetizers:
for main in main_courses:
for dessert in desserts:
meal_combinations.append((app, main, dessert))
return meal_combinations
def generate_combo_deals(menu_items, combo_size):
"""Generate all possible combo deals of the specified size."""
return list(itertools.combinations(menu_items, combo_size))
## Menu categories
appetizers = ["Salad", "Soup", "Bruschetta"]
main_courses = ["Pasta", "Steak", "Fish"]
desserts = ["Ice Cream", "Cake", "Fruit"]
## All menu items
all_items = appetizers + main_courses + desserts
## Generate all possible three-course meals
meals = generate_meal_combinations(appetizers, main_courses, desserts)
## Generate all possible 2-item combo deals from the entire menu
combos = generate_combo_deals(all_items, 2)
## Display the results
print("Restaurant Menu Planner\n")
print("Menu Items:")
print(f"Appetizers: {appetizers}")
print(f"Main Courses: {main_courses}")
print(f"Desserts: {desserts}\n")
print(f"Total possible three-course meals: {len(meals)}")
print("Sample meals:")
for i in range(min(5, len(meals))):
app, main, dessert = meals[i]
print(f"Meal option {i+1}: {app} + {main} + {dessert}")
print(f"\nTotal possible 2-item combo deals: {len(combos)}")
print("Sample combo deals:")
for i in range(min(5, len(combos))):
print(f"Combo {i+1}: {' + '.join(combos[i])}")
- Execute o script:
python3 menu_combinations.py
A saída mostrará várias combinações de refeições e ofertas combinadas que podem ser criadas a partir dos itens do menu.
Esses exemplos demonstram como a função itertools.combinations() pode ser aplicada para resolver problemas do mundo real envolvendo combinações de itens. Ao entender como usar essa função de forma eficaz, você pode desenvolver soluções mais eficientes para problemas que envolvem a seleção de grupos de itens de um conjunto maior.