История на Python помогает понять Itertools

Не всегда начинайте учить с сухой теории

Многие разработчики Python любят использовать модуль Itertools, который действительно очень мощный. Перестановки и комбинации - одни из самых популярных функций в этом модуле.

Когда люди изучают эти два термина, почти всегда начинают с теории. Это одно из направлений математики - комбинаторика. Кроме того, есть много принципов и формул, которые нужно понять, и даже воспоминания.

Что ж, теория важна, но иногда это может быть не самый быстрый способ применить знания на практике, особенно когда мы хотим использовать программирование для решения некоторых проблем в реальной жизни.

Например, вряд ли мы соберем красные и синие шары в сумке с заменой или без нее. Однако мы с большей вероятностью воспользуемся программированием для создания списка, чтобы спланировать, кто за что-то дежурит :)

В этой статье я представлю 4 важные функции (product(), permutations(), combinations() и combinations_with_replacement()) в модуле Itertools в Python на практическом примере.

0. Определение проблемы и подготовка

А теперь перейдем непосредственно к проблеме. Предположим, у нас есть команда из трех человек:

  • Алиса
  • Боб
  • Крис

Нам нужен кто-то на связи в эти выходные, потому что рекламная кампания должна привлечь на наш веб-сайт необычный трафик. Итак, осталось два дня, нам нужны имена.

Допустим, нам нужно использовать Python для создания всех возможностей реестра. Поскольку нам нужно использовать модуль Itertools, давайте импортируем все функции для удобства в этой статье.

from itertools import *

1. Любые лица в два дня

В первом случае порядок этих двух человек имеет значение. Это возможно, потому что суббота и воскресенье могут иметь для кого-то разное значение.

Кроме того, допустим, эти парни не возражают по дежурству оба дня, если только предположить :)

В этом случае мы можем использовать функцию product(), которая представляет собой декартово произведение. В основном все возможности будут перечислены и исчерпаны.

for i in product(['Alice', 'Bob', 'Chris'], repeat=2):
    print(list(i))

В приведенном выше коде функция product() принимает два аргумента. Первый - это список всех имен, а второй сообщает, сколько «пробелов» нам нужно заполнить.

2. Два разных человека в два дня

Я слышу, как команда жалуется, потому что они, конечно же, не хотят быть на связи в течение двух дней. Таким образом, два имени в списке не должны повторяться. Кроме того, порядок по-прежнему имеет значение.

В этом случае мы можем использовать permutations(), потому что он строго берет два без повторения.

for i in permutations(['Alice', 'Bob', 'Chris'], 2):
    print(list(i))

С момента появления этой функции подпись изменилась, поэтому мы не должны использовать имя параметра repeat. Два аргумента изменять не нужно, все же список имен и количество пробелов.

3. Любые лица в течение двух дней без заказа

В этом случае предположим, что у членов команды будет своя собственная гибкость, в течение какого дня они будут на связи, если они включены в реестр. Это означает, что порядок больше не важен, потому что ребята, которых забирают, могут общаться друг с другом, чтобы решить, какой день они выберут.

Чтобы удовлетворить эту потребность, нам нужно использовать функциюcombinations_with_replacement().

for i in combinations_with_replacement(['Alice', 'Bob', 'Chris'], 2):
    print(list(i))

4. Два разных человека в два дня без заказа.

После предыдущего запуска команда снова жалуется, потому что мы забыли сделать людей неповторимыми. Поэтому в этом случае имена не должны повторяться, а также порядок имеет значение.

В этом сценарии нам нужно использовать функцию combinations() следующим образом.

for i in combinations(['Alice', 'Bob', 'Chris'], 2):
    print(list(i))

Резюме

Вы заметили, что на самом деле мы играли с двумя условиями?

  • Порядок имеет значение или нет
  • Повторяемый человек или нет

Для того, чтобы поставить «да» или «нет» на два вышеупомянутых условия, у нас есть как раз возможности. На самом деле мы можем использовать функцию product(), чтобы исчерпать все возможности, потому что «да или нет» может повторяться, и порядок имеет значение ».

for i in product(['Yes', 'No'], repeat=2):
    print(i)

Пока, я надеюсь, вы поняли, когда использовать эти 4 функции из модуля Itertools для определенных сценариев. Я также организовал их на диаграмме ниже. Надеюсь, это прояснит!

В конце концов, как обычно - ›Жизнь коротка, используйте Python!