Разум проснулся: 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__. Завтра посмотрю, сейчас — спать.

Комментарии 13

eattheopera.myopenid.com № 1
«Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live.»
-- Rick Osborne

Мне кажется, что в данном случае можно и без адреса обойтись. Сразу бомбой.
eattheopera.myopenid.com № 2
Вот isagalaev в предыдущем посте так написал /all/1860#n4302, приятно разбирать.
Но вообще я тоже питон люблю именно за то, что можно использовать совершенно разные парадигмы программирования.
Евгений Степанищев (bolknote.ru) автор № 3
Комментарий для eattheopera.myopenid.com:

Я задачу изменил, там генератор не подойдёт, так как есть выбор. Кстати, в чём глупость моего «item==''» понял только ночью. Привык в PHP, что '0'==0
isagalaev (softwaremaniacs.org/about/) № 6
Кстати, тебе по-моему реально не нужен starmap… Вместо:

starmap(lambda item, grp: …, …)

реально проще:

(… for item, grp in …)
sl37.livejournal.com № 9
А я, с тех пор как начал писать на Пайтоне, не могу писать на других языках: ленюсь расставлять операторные скобки и разделители операторов. Отступы рулят!
Евгений Степанищев (bolknote.ru) автор № 10
Я иногда плююсь на отступ: когда надо быстро сунуть print для отладки, раздражает, что нужно делать отступ :)
thebobuk (thebobuk.ya.ru) № 12
искренне надеюсь что этого кода я никогда не увижу в продакшне.
Потому что на его переделку у того, кто не имеет лисповой и вообще функциональной передлки уйдут часы.
Евгений Степанищев (bolknote.ru) автор № 13
На ознакомление с itertools уходит минут 10-15. После этого такие выражения читаются с лёгкостью. По крайней мере это мой личный опыт.