Как-то однажды нужно было написать конвертацию одного списка в другой:
[('www.ya.ru', set()), ('ya.ru', set()), ('xxx.x', set())]
И нужно из этого получить список с доменами без www, где множества, находящиеся с ними в одном tuple, объедены:
[('ya.ru', set()), ('xxx.x', set())]
Писать, как это решить обычно и просто, думаю, смысла нет. Но в тот момент я находился в интерактивном питоне и писал, что идет в голову. В итоге родился ад, который лично мне не наносит никакой боли, хотя я не уверен, что это нельзя сделать проще. Скорее всего, можно, но я этим не занимался.
resolved = reduce(lambda x, y: x[:-1]+[(y[0][0], y[0][1].union(x[-1][1]))] if x[-1][0]==y[0][0] else x+y, sorted([[(i[0].split('www.')[-1], i[1])] for i in resolved]))
Но вопрос в том, что если вы бы встретили в проекте, который вам поддерживать, что-то в этом роде, как бы вы к этому отнеслись? Предположим, что под рукой у вас горячий паяльник.
Оговорюсь, что я считаю, что этот код не по философии питона, его вряд ли можно назвать хорошим. Но, гипотетически, его появление с комментом о том, что он делает, - это не слишком печально для остальных разработчиков? Или лучше не заниматься подобными функциональными изысками? Что бы вы подумали о человеке, который это написал и оставил после рефакторинга?
p.s. Если кто-то решил использовать что-либо из примера выше, настоятельно не рекомендую, так как он содержит баг и, вообще, не крутой. Крутой пример для этой же задачи есть в комментариях.
С учетом этого суть вопроса топика может быть изложена иначе: жесть ли переписывать маленькие/самодостаточные алгоритмы в функциональный стиль (при наличии адекватного оформления кода и пояснений) внутри императивной программы?