Шаг 92.
Однострочники Python. Алгоритмы. Вычисление булеана с помощью функционального программирования. Общее описание

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

    Булеан (powerset) - это множество всех подмножеств заданного множества s, включающее пустое множество {}, исходное множество s и все прочие возможные подмножества исходного множества. Ниже даны несколько примеров.

    Пример 1:

множество: s = {1};
его булеан: P = {{},{1}}.

    Пример 2:

множество: s = {1, 2};
его булеан: P = {{},{1},{2},{1,2}}.

    Пример 3:

множество: s = {1, 2, 3};
его булеан: P = {{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}}.

    Для вычисления булеана Pn множества s, состоящего из n элементов, можно использовать булеан Pn-1 подмножества s, состоящего из (n - 1) элемента. Пусть нам требуется вычислить булеан множества s = {1, 2, 3}.

  1. Зададим начальное значение булеана Р0 с нулем элементов как Р0 = {{}}. Другими словами, это булеан пустого множества. Он содержит только само пустое множество.

  2. Для создания на основе булеана Pn-1 множества, состоящего из (n - 1) элемента булеана Pn, состоящего из n элементов, возьмем один (произвольный) элемент х из множества s и включим все получающиеся подмножества в больший булеан Pn с помощью следующей процедуры.

  3. Проходим по всем множествам p в Pn-1 и создаем новые подмножества, состоящие из объединения х и р. В результате получаем новое временное множество множеств T. Например, если Р2 = {{}, {1}, {2}, {1, 2}}, то мы создадим временное множество множеств T = {{3}, {1, 3}, {2, 3}, {1, 2, 3}} путем добавления элемента х ко всем множествам из P2.

  4. Объединяем это новое множество множеств T с булеаном Pn-1 и получаем булеан Pn. Например, булеан Р3 получается путем объединения временного множества T с булеаном Р2 следующим образом: P3 = T ∪ P2.

  5. Переходим на шаг 2 до тех пор, пока исходное множество s не окажется пустым.

    Далее вас ждут более подробные пояснения этой стратегии.

Функция reduce()

    Но сначала необходимо как следует разобраться с важной функцией Python, которую мы применим в нашем однострочнике: reduce(). Отметим, что сначала ее нужно импортировать из библиотекия functools. Функция принимает три аргумента:

  reduce(функция, итерируемый_объект, начальное_значение)   . 

    Аргумент функция определяет способ свертки двух значений x и у в одно (например, lambda x, y: x + y). Таким образом можно в цикле свертывать два значения итерируемый_объект (второй аргумент) в одно до тех пор, пока в итерируемый_объект не останется только одно значение. Аргумент начальное_значение - необязательный, если его не указать, Python будет использовать по умолчанию первое значение итерируемый_объект.

    Например, при вызове

  reduce(lambda x, y: x + y, [0, 1, 2, 3]) 
производятся следующие вычисления: (((0 + 1) + 2) + 3) = 6. Другими словами, сначала два значения x=0 и y=1 свертываются в их сумму x + y = 0 + 1 = 1. Этот результат первого вызова лямбда-функции служит входными данными для второго ее вызова: x=1 и y=2. В результате получается сумма x + y = 1 + 2 = 3. Наконец, результат этого второго вызова лямбда-функции служит входными данными для третьего ее вызова: x=3 и y=3. В результате получается сумма x + y = 3 + 3 = 6.

    В этом последнем примере, как вы могли заметить, значение x всегда было равно результату предыдущего вызова лямбда-функции. Аргумент x играет роль значения-накопителя, а аргумент y - обновляемого значения из итерируемый_объект. Такое поведение нацелено на "свертку" в цикле всех значений из итерируемый_объект в одно значение. Необязательный третий аргумент задает начальное значение для x. Все это позволяет описать агрегатор для последовательностей, как показано в следующем 93 шаге.

Арифметические операции над списками

    Прежде чем заняться непосредственно однострочником, вам нужно понимать, как работают еще две операции над списками. Первая из них - оператор конкатенации списков +, склеивающий два списка. Например, результат операции [1, 2] + [3, 4] - новый список [1, 2, 3, 4]. Вторая - оператор объединения |, производящий простую операцию объединения двух множеств. Например, результат выражения {1, 2} | {3, 4} - новое множество {1, 2, 3, 4}.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг