[МУЗЫКА] В этом видео мы обсудим, как генерируются упорядоченные выборки в Python. Давайте начнем с простых примеров: с правила суммы и правила произведения. Для правила суммы вот здесь у нас задано два множества. Первое множество состоит из элементов a, b и c, второе множество состоит из элементов d, e, f. Дальше мы выдаем их объединение. Давайте запустим, посмотрим. Вот, действительно, в первой строчке здесь выдалось их объединение в каком-то порядке. Это будет честное объединение. Давайте попробуем добавить, например, сюда элемент d, тоже чтобы он присутствовал в обоих множествах, и тогда, в принципе, он в объединении должен быть указан только один раз. И, действительно, так и произошло, то есть тут все нормально работает. Дальше у нас пример на правило произведения, и для этого мы загружаем из библиотеки itertools специальную функцию product. Она получает два списка и выдает пары элементов из этих списков, то есть первый элемент пары будет из первого списка, а второй элемент пары будет из второго списка — как раз то, что нам нужно в правиле произведения. И дальше она вот их печатает. Ну мы, на самом деле, уже запустили, и вот получается весь наш список. Здесь пары (a, x), (a, y), (b, x), (b, y), (c, x) и (c, y). Видно, что выдача тут не очень удобная. То есть если у нас всего шесть пар получилось, это, в принципе, пока нормально, но если их будет больше, то читать это будет не очень удобно, поэтому давайте заведем сразу другую выдачу вместо той, что у нас сейчас была. Запустим, посмотрим. Вот теперь пары выдались гораздо удобнее: у нас здесь между элементами пар никаких разделителей нет, получились просто слова длины 2, а между парами самими получился разделитель пробел. Действительно, вот здесь это все так и задано, то есть мы для начала между элементами пар задаем разделитель пустой. Мы здесь можем, на самом деле, этим ограничиться и попробовать запустить так. Что тогда произойдет? Тогда да, у нас элементы пар теперь отделены по-прежнему пустым символом, у нас просто элементы пар идут подряд, но каждая выдается на своей строке. Мы отдельно еще задаем, что между парами у нас будет разделитель пробел. Вот здесь это задано, и если мы их запустим, то они будут через пробел. Хорошо, давайте перейдем к следующему блоку. Теперь мы хотим генерировать слова, и, оказывается, та же самая функция product для этого годится. Мы задаем алфавит, вот здесь у нас три символа: a, b и c. В этом алфавите мы будем задавать наши слова. И дальше мы задаем длину слова, длина слова у нас здесь будет 3, то есть будет произведение этого алфавита на себя три раза. Давайте это запустим. Опять же, мы с тем же разделителем это сделаем. Давайте здесь запустим. Они здесь выдались каждая на своей строке. Ничего страшного, мы можем, если нам хочется читать это чуть удобнее, то мы можем скопировать сюда разделитель между словами, и он будет пробел. Вот тогда они здесь все и будут выданы. Хорошо. Допустим, мы теперь хотим сгенерировать все числа именно как слова, то есть в тех же терминах, в каких мы генерировали слова, тогда мы захотим в качестве алфавита взять цифры от 0 до 9. Вот мы здесь это делаем. Например, мы хотим сгенерировать числа длины 2, тогда мы можем это запустить, но единственное, что вот надо заметить, что команда для печати здесь немножко другая, потому что для того, чтобы у нас join сработал, нужно подставлять в него строки, поэтому мы должны сначала отобразить элементы нашего слова в символы, то есть от цифр перейти к символам, а потом уже применить вот то, что мы применяем в выдаче. Так, хорошо, вот у нас все двузначные слова напечатались. Можем трехзначными их, например, сделать: мы сейчас напечатаем просто все трехзначные числа. Видно, что они печатаются по возрастанию, то есть у нас сначала печатаются все числа с цифрой ноль, потом с цифрой один и так далее, то есть просто вот все очень удобно печатается. Давайте перейдем к перестановкам. Дальше мы можем генерировать k-перестановки. Для этого уже нужна другая функция из той же библиотеки, она так и называется permutations. Вот у нас есть пример на нее, тоже у нас задан алфавит. Задаем длину перестановки, то есть у нас будет 3-перестановка в этом алфавите из четырех символов. Давайте запустим. Печатаются слова без повторений букв, то есть, опять же, вот abc, abd и так далее. Видно, что все слова здесь напечатались. Мы могли бы, например, напечатать слова длины 2, могли бы в пятибуквенном алфавите напечатать слова, то есть мало что меняется по существу. Ну или, например, слова длиной 3 в пятибуквенном алфавите, их будет уже побольше. Мы хотели бы иногда, наверно, печатать и n-перестановки, то есть не указывать параметр, печатать просто перестановки максимальной длины, тогда мы можем просто, на самом деле, стереть здесь второй параметр, он опциональный, и тогда просто напечаются все перестановки длины 5 из вот наших пяти символов. Хорошо, ну и давайте теперь посмотрим на пример того, как можно было бы решать задачки, которые мы решали в лекции, с помощью Python. Вот здесь хотелось бы решить такую задачу, которую мы разбирали, это подсчитать количество чисел четырехзначных, содержащих ровно одну цифру 7. Мы можем сделать это, например, так. Мы можем взять, как мы уже вот только что делали, задать все возможные числа. То есть вот здесь вот у нас в product задаются все возможные числа длины 4. Дальше мы заводим счетчик, и мы увеличиваем счетчик каждый раз, когда мы встретили число, содержащее ровно одну цифру 7. Вот здесь вот это условие задано, и здесь вот мы, например, можем — давайте пока выдачу числа уберем, и тогда у нас посчитается это количество: действительно, сошлось с тем, что мы получили в лекции, — можем также все эти числа выдать. Вот они тут все напечатаются, их довольно много. Действительно, их много. Давайте, наверно, тогда вместо того, чтобы считать все числа, в которых одна цифра 7, посчитаем все числа, в которых две цифры 7, их должно быть поменьше. Вот тогда да, они хотя бы помещаются у нас на экран. Вот здесь, правда, неудобно получилось, что в конце у нас количество этих чисел печатается в той же строке. Давайте добавим просто пустую строку, и получится, что вот: количество этих чисел с двумя семерками у нас 486, а например, с тремя семерками количество будет 36. Ну еще можно попробовать с четырьмя семерками, должно быть одно такое число. Давайте посмотрим. Действительно, такое число одно. Все правильно работает. [МУЗЫКА]