Это сайт — моя персональная записная книжка. Интересна мне, по большей части, история, своя жизнь и немного программирование.

Разум проснулся: 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 2008

«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 2008

Вот isagalaev в предыдущем посте так написал http://bolknote.ru/all/1860#n4302​, приятно разбирать.
Но вообще я тоже питон люблю именно за то, что можно использовать совершенно разные парадигмы программирования.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для eattheopera.myopenid.com:

Я задачу изменил, там генератор не подойдёт, так как есть выбор. Кстати, в чём глупость моего «item==’’» понял только ночью. Привык в PHP, что ’0’==0

voldmar (voldmar.ya.ru) 2008

А чего ты не попросишь на сервере 2.5?

Евгений Степанищев (bolknote.ru) 2008

Комментарий для voldmar.ya.ru:

Как я понял — Python в пакете, от него многое зависит. Зависимости просят именно 2.4

isagalaev (softwaremaniacs.org/about/) 2008

Кстати, тебе по-моему реально не нужен starmap... Вместо:

starmap(lambda item, grp: ..., ...)

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

(... for item, grp in ...)

VasT (vast.myopenid.com) 2008

А можно как-то для не особо программирующих на питоне объяснить, что вообще там происходит?

Евгений Степанищев (bolknote.ru) 2008

Комментарий для vast.myopenid.com:

Отличная идея, попробую ближе к вечеру расписать!

sl37.livejournal.com 2008

А я, с тех пор как начал писать на Пайтоне, не могу писать на других языках: ленюсь расставлять операторные скобки и разделители операторов. Отступы рулят!

Евгений Степанищев (bolknote.ru) 2008

Комментарий для sl37.livejournal.com:

Я иногда плююсь на отступ: когда надо быстро сунуть print для отладки, раздражает, что нужно делать отступ :)

Евгений Степанищев (bolknote.ru) 2008

Комментарий для 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 (thebobuk.ya.ru) 2008

искренне надеюсь что этого кода я никогда не увижу в продакшне.
Потому что на его переделку у того, кто не имеет лисповой и вообще функциональной передлки уйдут часы.

Евгений Степанищев (bolknote.ru) 2008

Комментарий для thebobuk.ya.ru:

На ознакомление с itertools уходит минут 10-15. После этого такие выражения читаются с лёгкостью. По крайней мере это мой личный опыт.