Pull to refresh

Comments 12

Язык развивается, что ж вы пишете, как в прошлом веке?

Для первого примера:
from itertools import permutations

print(' '.join(map(lambda x: ''.join(x), permutations('abc'))))
 # abc acb bac bca cab cba


Не нравится функциональный подход, пожалуйста:
[''.join(x) for x in permutations('abc')]
# ['abc', 'acb', 'bac', 'bca', 'cab', 'cba']


Раз акцент на язык программирования, то пишите на питоне, как на питоне, а не как на языке, который вы знаете.
Не успел отредактировать, только не запускайте примеры на коллекциях больше 9 элементов. )
print(*map(''.join, permutations('abc')))

Хорошо ругаетесь, а вот над функциональным подходом стоит поработать.
Хорошо ругаетесь, а вот над функциональным подходом стоит поработать.

Не стоит. Я думаю, вы не уловили суть комментария автора. Кажется он хотел напомнить, что Питон рекомендует по возможности выбирать списковые включения вместо мапов (если я правильно понял посыл)
Определённо не уловил: он же сам их (мапы) и использует.
Использует хуже, чем мог бы, что я и отметил.
Так что уж впредь запаситесь аргументами получше, как надумаете минусовать.
На PEP сошлитесь, где «Питон рекомендует», а то подумают, что вы на заборе прочитали.
Определённо не уловил: он же сам их (мапы) и использует.

Может я не так понял. Я подумал, что вместо первого примера он предлагает второй.

На PEP сошлитесь, где «Питон рекомендует», а то подумают, что вы на заборе прочитали.

Это не пеп, это Гвидо на заборе написал.

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

Так что уж впредь запаситесь аргументами получше, как надумаете минусовать.

Ого, сколько агрессии! Я не согласен с вашим комментарием, поставил ему минус и написал, почему я это сделал. Мне кажется, так и надо делать? Если вас это утешит, то за тот комментарий мне кто-то молча поставил минус в карму, не потрудившись аргументировать, ну бывают такие люди. Не принимайте близко к сердцу этот спор.
Хотя надо отметить, я не знаю, как reduce заменить списковым включением, чтоб это было читабельнее и без нагромождающих конструкций
Никак.
Редюс возвращает результат свёртки, а он может быть произвольного типа — того, который возвращает функция свёртки. Можно даже так пошалить:
from functools import reduce

l = [1, 2, 3]
print(reduce(lambda x, y: (x, x.append(y * 2))[0], l, []))
— только зачем?
А вот списковое включение возвращает именно список, и с этим ничего не поделать.
По-моему, есть очень важное отличие — в ваших примерах все вариации сохраняются в память, а в примерах в статье — выводятся в поток. Ну то есть можно даже собрать некоторую цепочку команд, одна из которых будет генерировать варианты перестановок, а вторая что-то по ним обсчитывать.

Зачем везде лепить функциональный подход и «новые возможности языка»? «Старое» — не значит «плохое».
… предоставляет множество средств для генерирования комбинаторных объектов, но в интернете мне не удалось найти не одной статьи, которая подробно рассказывала бы о работе с ними

Потому что работает это только на тестовых задачках. Вы сами привели оценку количества перестановок, на какой железке всю это комбинаторику считать?
задача 1. Для второго человека почему 17 получилось?
Первая пара 2 человека, их исключаем, осталось 18 человек. Берем первого из них и ищем ему пару из оставшихся 17. Исключаем вторую пару, осталось 16, берем первого из них и ищем пару из 15. Получается произведение нечетных чисел
Sign up to leave a comment.

Articles