Комбінації в Python: як отримати всі варіанти без зайвого коду

21.10.2025 7 хвилин Автор: Lady Liberty

Якщо ви тільки починаєте працювати з Python і хочете навчитися швидко створювати різні поєднання елементів, функція itertools.combinations — саме те, що потрібно. Вона дозволяє легко знаходити всі можливі пари, трійки чи будь-які інші набори без повторень і складного коду. У статті ви дізнаєтесь, як правильно використовувати цю функцію, для чого потрібен параметр r і як вона допомагає в реальних завданнях — від формування команд до створення варіантів меню чи наборів товарів. Ми покажемо покрокові приклади, пояснимо синтаксис і розберемо типові помилки. Все простою мовою, щоб навіть початківці змогли зрозуміти логіку комбінацій у Python і застосувати її у своїх проектах.

Як використовувати itertools.combinations у Python

Модуль Python itertoolsнадає набір швидких, ефективних з точки зору пам’яті інструментів для створення ітераторів для ефективного циклу. Одна особливо корисна функція з цього модуля – combinations(), яка дозволяє генерувати всі можливі комбінації заданої довжини з колекції елементів.

У цій лабораторній роботі ви дізнаєтеся, як використовувати itertools.combinations()функцію для створення комбінацій елементів, зрозуміти її параметри та дослідити практичне застосування. Ці знання розширять ваш інструментарій програмування на Python та допоможуть вам вирішувати складні задачі, що включають комбінаторні операції.

Початок роботи з itertools.combinations

Почнемо з розуміння того, що таке комбінації та як використовувати ці itertools.combinations()функції в Python.

Що таке комбінації?

У математиці комбінація — це вибір елементів з колекції, де порядок не має значення. Наприклад, під час вибору 2 елементів з множини {1, 2, 3} можливими комбінаціями є {1, 2}, {1, 3} та {2, 3}.

Встановлення необхідних модулів

Модуль Python itertoolsє частиною стандартної бібліотеки, тому вам не потрібно встановлювати нічого додатково. Давайте створимо новий файл Python для експериментів з combinationsфункцією.

  1. У WebIDE створіть новий файл, натиснувши на значок «Новий файл» на панелі «Провідник» або скориставшись комбінацією клавіш Ctrl+N.

  2. Збережіть файл як combinations_intro.pyу /home/labex/projectкаталозі.

  3. Тепер давайте напишемо простий скрипт на Python, щоб продемонструвати базове використання itertools.combinations:

## Import the combinations function from itertools module
import itertools

## Create a simple list of elements
fruits = ['apple', 'banana', 'orange']

## Generate all combinations of 2 fruits from the list
fruit_combinations = itertools.combinations(fruits, 2)

## Convert the iterator to a list to display all combinations
combinations_list = list(fruit_combinations)

## Print the result
print("All possible combinations of 2 fruits:")
print(combinations_list)

## Count the total number of combinations
print(f"Total number of combinations: {len(combinations_list)}")
  1. Запустіть скрипт, відкривши термінал (якщо він ще не відкритий) та виконавши:

python3 combinations_intro.py

Ви повинні побачити результат, подібний до цього:

All possible combinations of 2 fruits:
[('apple', 'banana'), ('apple', 'orange'), ('banana', 'orange')]
Total number of combinations: 3

Розуміння результату

Вивід показує всі можливі комбінації 2 елементів, вибраних з нашого списку фруктів. Кожна комбінація представлена ​​у вигляді кортежу:

  • («яблуко», «банан»)

  • («яблуко», «апельсин»)

  • («банан», «апельсин»)

Зверніть увагу, що комбінація типу (‘банан’, ‘яблуко’) не враховується, оскільки в комбінаціях порядок не має значення. Отже, (‘яблуко’, ‘банан’) та (‘банан’, ‘яблуко’) вважаються однією й тією ж комбінацією.

Розуміння параметрів та синтаксису

Тепер давайте глибше зануримося у itertools.combinations()функцію, детальніше досліджуючи її параметри та синтаксис.

Підпис функції

Функція itertools.combinations()має такий синтаксис:

itertools.combinations(iterable, r)

Де:

  • iterableПослідовність, ітератор або інший об’єкт, що підтримує ітерацію (наприклад, список, кортеж або рядок)

  • rДовжина кожної комбінації, яка має бути згенерована

Давайте створимо ще один файл Python для дослідження різних прикладів.

  1. Створіть новий файл з назвою combinations_parameters.pyв /home/labex/projectкаталозі.

  2. Додайте наступний код до файлу:

import itertools

## Example 1: Combinations from a string
letters = "ABCD"
print("Example 1: Combinations from a string 'ABCD', r=2")
letter_combinations = list(itertools.combinations(letters, 2))
print(letter_combinations)
print(f"Number of combinations: {len(letter_combinations)}\n")

## Example 2: Different values of r
numbers = [1, 2, 3, 4]

## r=1 (individual elements)
print("Example 2a: Combinations with r=1")
combinations_r1 = list(itertools.combinations(numbers, 1))
print(combinations_r1)
print(f"Number of combinations: {len(combinations_r1)}\n")

## r=2 (pairs)
print("Example 2b: Combinations with r=2")
combinations_r2 = list(itertools.combinations(numbers, 2))
print(combinations_r2)
print(f"Number of combinations: {len(combinations_r2)}\n")

## r=3 (triplets)
print("Example 2c: Combinations with r=3")
combinations_r3 = list(itertools.combinations(numbers, 3))
print(combinations_r3)
print(f"Number of combinations: {len(combinations_r3)}\n")

## r=4 (all elements)
print("Example 2d: Combinations with r=4")
combinations_r4 = list(itertools.combinations(numbers, 4))
print(combinations_r4)
print(f"Number of combinations: {len(combinations_r4)}\n")

## Example 3: Empty result when r is larger than the iterable length
print("Example 3: Empty result when r > len(iterable)")
too_large_r = list(itertools.combinations(numbers, 5))
print(too_large_r)
print(f"Number of combinations: {len(too_large_r)}")
  1. Запустіть скрипт:

python3 combinations_parameters.py

Ви повинні побачити результат, подібний до наступного:

Example 1: Combinations from a string 'ABCD', r=2
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]
Number of combinations: 6

Example 2a: Combinations with r=1
[(1,), (2,), (3,), (4,)]
Number of combinations: 4

Example 2b: Combinations with r=2
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
Number of combinations: 6

Example 2c: Combinations with r=3
[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]
Number of combinations: 4

Example 2d: Combinations with r=4
[(1, 2, 3, 4)]
Number of combinations: 1

Example 3: Empty result when r > len(iterable)
[]
Number of combinations: 0

Ключові висновки

З цих прикладів можна спостерігати кілька важливих властивостей функції itertools.combinations():

  1. Він працює з різними типами ітерованих об’єктів (рядки, списки тощо)

  2. Значення rвизначає розмір кожної комбінації

  3. Кількість комбінацій визначається за математичною формулою: n! / (r! * (nr)!), де n – довжина ітерованого об’єкта

  4. Коли rдорівнює довжині ітерабельного об’єкта, існує лише одна комбінація (весь ітерабельний об’єкт)

  5. Коли rперевищує довжину ітерованого об’єкта, повертається порожній список.

Таке розуміння параметрів допоможе вам itertools.combinations()ефективно застосовувати цю функцію у ваших програмах на Python.

Практичне застосування комбінацій

Тепер давайте розглянемо деякі практичні застосування цієї itertools.combinations()функції. Ми розглянемо кілька реальних прикладів, щоб продемонструвати, як цю функцію можна використовувати для вирішення поширених проблем.

Приклад 1: Формування команди

Уявіть, що вам потрібно сформувати команди певного розміру з групи людей. Давайте створимо програму, яка допоможе сформувати всі можливі команди.

  1. Створіть новий файл з назвою team_formation.pyв /home/labex/projectкаталозі.

  2. Додайте наступний код:

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)}")
  1. Запустіть скрипт:

python3 team_formation.py

Ви повинні побачити вивід, у якому перелічено всі можливі пари та тріо, які можна сформувати з шести членів команди.

Приклад 2: Пошук усіх підмножин

Ще одним поширеним застосуванням є генерація всіх можливих підмножин заданої множини (також відомої як степенева множина). Реалізуємо це:

  1. Створіть новий файл з назвою generate_subsets.pyв /home/labex/projectкаталозі.

  2. Додайте наступний код:

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)}")
  1. Запустіть скрипт:

python3 generate_subsets.py

Вивід покаже всі можливі підмножини множини {A, B, C}, включаючи порожню множину.

Давайте створимо практичний додаток, який допоможе ресторану генерувати всі можливі комбінації страв з пунктів меню:

  1. Створіть новий файл з назвою menu_combinations.pyв /home/labex/projectкаталозі.

  2. Додайте наступний код:

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])}")
  1. Запустіть скрипт:

python3 menu_combinations.py

У результатах буде показано різні комбінації страв та комбіновані пропозиції, які можна створити з пунктів меню.

Ці приклади демонструють, як itertools.combinations()функцію можна застосувати для вирішення реальних задач, що включають комбінації елементів. Розуміючи, як ефективно використовувати цю функцію, ви можете розробити більш ефективні рішення для задач, які передбачають вибір груп елементів з більшого набору.

Розв’язання задачі з комбінаціями

На цьому кроці ми застосуємо наші знання itertools.combinations()для вирішення поширеної задачі програмування. Ми реалізуємо рішення для знаходження всіх можливих способів вибору елементів із заданим загальним значенням, яке часто називають задачею “Сума підмножин”.

Проблема: Пошук підмножин із цільовою сумою

Уявіть, що у вас є набір чисел, і ви хочете знайти всі підмножини, які в сумі дають певну цільову суму. Це класична задача, яку можна розв’язати за допомогою комбінацій.

Давайте реалізуємо рішення:

  1. Створіть новий файл з назвою subset_sum.pyв /home/labex/projectкаталозі.

  2. Додайте наступний код:

import itertools

def find_subsets_with_sum(numbers, target_sum):
    """Find all subsets of numbers that add up to the target sum."""
    results = []

    ## Try combinations of different lengths
    for r in range(1, len(numbers) + 1):
        ## Generate all combinations of length r
        combinations = itertools.combinations(numbers, r)

        ## Check each combination
        for combo in combinations:
            if sum(combo) == target_sum:
                results.append(combo)

    return results

## Example usage
numbers = [3, 5, 2, 7, 4, 9, 1, 8]
target_sum = 10

## Find subsets with sum equal to target_sum
matching_subsets = find_subsets_with_sum(numbers, target_sum)

## Display results
print(f"Numbers: {numbers}")
print(f"Target sum: {target_sum}")
print(f"Number of matching subsets: {len(matching_subsets)}")

if matching_subsets:
    print("Subsets that add up to the target sum:")
    for i, subset in enumerate(matching_subsets, 1):
        print(f"Subset {i}: {subset} (Sum: {sum(subset)})")
else:
    print("No subsets found that add up to the target sum.")

## Let's find subsets for another target sum
second_target = 15
matching_subsets_2 = find_subsets_with_sum(numbers, second_target)

print(f"\nTarget sum: {second_target}")
print(f"Number of matching subsets: {len(matching_subsets_2)}")

if matching_subsets_2:
    print("Subsets that add up to the target sum:")
    for i, subset in enumerate(matching_subsets_2, 1):
        print(f"Subset {i}: {subset} (Sum: {sum(subset)})")
else:
    print("No subsets found that add up to the target sum.")
  1. Запустіть скрипт:

python3 subset_sum.py

У результаті будуть показані всі комбінації чисел з нашого списку, які в сумі дають цільову суму 10, а потім 15.

Розширення: Інтерактивна версія

Давайте покращимо наше рішення, зробивши його інтерактивним, дозволивши користувачеві вводити власний список чисел та цільову суму:

  1. Створіть новий файл з назвою interactive_subset_sum.pyв /home/labex/projectкаталозі.

  2. Додайте наступний код:

import itertools

def find_subsets_with_sum(numbers, target_sum):
    """Find all subsets of numbers that add up to the target sum."""
    results = []

    ## Try combinations of different lengths
    for r in range(1, len(numbers) + 1):
        ## Generate all combinations of length r
        combinations = itertools.combinations(numbers, r)

        ## Check each combination
        for combo in combinations:
            if sum(combo) == target_sum:
                results.append(combo)

    return results

def main():
    ## Get user input
    try:
        input_str = input("Enter a list of numbers separated by spaces: ")
        numbers = [int(num) for num in input_str.split()]

        target_sum = int(input("Enter the target sum: "))

        ## Find matching subsets
        matching_subsets = find_subsets_with_sum(numbers, target_sum)

        ## Display results
        print(f"\nNumbers: {numbers}")
        print(f"Target sum: {target_sum}")
        print(f"Number of matching subsets: {len(matching_subsets)}")

        if matching_subsets:
            print("Subsets that add up to the target sum:")
            for i, subset in enumerate(matching_subsets, 1):
                print(f"Subset {i}: {subset} (Sum: {sum(subset)})")
        else:
            print("No subsets found that add up to the target sum.")

    except ValueError:
        print("Invalid input. Please enter integers only.")

if __name__ == "__main__":
    main()
  1. Запустіть інтерактивний скрипт:

python3 interactive_subset_sum.py
  1. Коли буде запропоновано, введіть список чисел (наприклад, 3 5 2 7 4 9 1 8) та цільову суму (наприклад, 10).

Скрипт знайде та відобразить усі комбінації вхідних чисел, які в сумі дають задану цільову суму.

Розуміння рішення

Наше рішення використовує itertools.combinations()для генерації підмножин різного розміру з вхідного списку чисел. Для кожної підмножини ми перевіряємо, чи сума дорівнює цільовому значенню, і якщо так, то додаємо його до наших результатів.

Цей підхід демонструє потужне застосування комбінацій у вирішенні поширеної алгоритмічної задачі. Ефективність itertools.combinations()дозволяє ефективно вирішувати задачу сумування підмножин для малих та середніх вхідних даних.

На практиці, для дуже великих списків можуть знадобитися більш оптимізовані алгоритми, але для багатьох реальних сценаріїв цей підхід, заснований на комбінаціях, забезпечує чисте та зрозуміле рішення.

Короткий зміст

У цій лабораторній роботі ви навчилися використовувати itertools.combinations()функції Python для створення комбінацій з колекції елементів.

Ось ключові висновки:

Базове використання : itertools.combinations(iterable, r)

  • Функція генерує всі можливі комбінації довжини rз вхідних даних iterable.

Параметри функції: Функція приймає два параметри:

  • iterableПослідовність, ітератор або інший об’єкт, що підтримує ітерацію

  • rДовжина кожної комбінації, яка має бути згенерована

Ключові властивості:

  • Порядок не має значення в комбінаціях

  • Жоден елемент не може з’являтися в комбінації більше одного разу

  • Функція повертає ітератор, який генерує комбінації по одній за раз

Практичне застосування: Ви навчилися застосовувати combinations()функцію для вирішення різних задач:

  • Формування команди з групи людей

  • Генерація всіх підмножин заданої множини

  • Створення комбінацій страв та комбо-пропозицій

  • Знаходження підмножин, які в сумі дають цільову суму

Ця itertools.combinations()функція є потужним інструментом для вирішення задач, пов’язаних з вибором груп елементів з більшої колекції. Використовуючи цю функцію, ви можете написати чистіший та ефективніший код для обробки комбінаторних операцій у Python.

Підписатися
Сповістити про
0 Коментарі
Найстаріші
Найновіше Найбільше голосів
Знайшли помилку?
Якщо ви знайшли помилку, зробіть скріншот і надішліть його боту.