Разум проснулся: Python itertools
С подсказки Вани в комментариях к предыдущему посту посмотрел itertools. И вот что я вам скажу товарищи. Если за что-то и любить «Пайтон», то за итераторы и генераторы (а ещё за суперпозицию функций, но это отдельная тема), а переписанный код из предыдущего поста выглядит теперь вот так:
from itertools import groupby, chain, starmap
def ntrim(letter, n=3, replby=1):
return list(chain(
*starmap(
lambda item, grp: [grp, [''] * replby][item and len(grp)>=n],
((item, list(grp)) for item, grp in
groupby(chain(['']*n, letter, ['']*n), lambda x:x)
)
)
))[replby:-replby]
Я модифицировал исходную задачу: последовательности из трёх и более пустых строк заменяются на одну, пустые элементы в начале и конце списка удаляются. И ещё я прибил ленивый триплет из Python 2.5, потому что на домашнем ноуте у меня 2.5, а на рабочем сервере будет 2.4. Надо, кстати, будет посмотреть не цепляется ли он как-то через __future__. Завтра посмотрю, сейчас — спать.
«Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.»
-- Rick Osborne
Мне кажется, что в данном случае можно и без адреса обойтись. Сразу бомбой.
Вот isagalaev в предыдущем посте так написал http://bolknote.ru/all/1860#n4302, приятно разбирать.
Но вообще я тоже питон люблю именно за то, что можно использовать совершенно разные парадигмы программирования.
Комментарий для eattheopera.myopenid.com:
Я задачу изменил, там генератор не подойдёт, так как есть выбор. Кстати, в чём глупость моего «item==’’» понял только ночью. Привык в PHP, что ’0’==0
А чего ты не попросишь на сервере 2.5?
Комментарий для voldmar.ya.ru:
Как я понял — Python в пакете, от него многое зависит. Зависимости просят именно 2.4
Кстати, тебе по-моему реально не нужен starmap... Вместо:
starmap(lambda item, grp: ..., ...)
реально проще:
(... for item, grp in ...)
А можно как-то для не особо программирующих на питоне объяснить, что вообще там происходит?
Комментарий для vast.myopenid.com:
Отличная идея, попробую ближе к вечеру расписать!
А я, с тех пор как начал писать на Пайтоне, не могу писать на других языках: ленюсь расставлять операторные скобки и разделители операторов. Отступы рулят!
Комментарий для sl37.livejournal.com:
Я иногда плююсь на отступ: когда надо быстро сунуть print для отладки, раздражает, что нужно делать отступ :)
Комментарий для softwaremaniacs.org/about/:
В итоге, стало так:
return list(
chain(
*(
[[’’], grp][item or len(grp)<n]
for item, grp in list(grp
for item, grp in groupby(chain([’’]*n, letter, [’’]*n), lambda x:x))
)
)
)[replby:-replby]
Больше менять не буду :)
искренне надеюсь что этого кода я никогда не увижу в продакшне.
Потому что на его переделку у того, кто не имеет лисповой и вообще функциональной передлки уйдут часы.
Комментарий для thebobuk.ya.ru:
На ознакомление с itertools уходит минут 10-15. После этого такие выражения читаются с лёгкостью. По крайней мере это мой личный опыт.