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

eattheopera.myopenid.com (eattheopera.myopenid.com)
17 сентября 2008, 09:30

"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 (eattheopera.myopenid.com)
17 сентября 2008, 09:42

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

bolk (bolknote.ru)
17 сентября 2008, 09:48, ответ предназначен eattheopera.myopenid.com:

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

voldmar (voldmar.ya.ru)
17 сентября 2008, 12:14

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

bolk (bolknote.ru)
17 сентября 2008, 12:16, ответ предназначен voldmar (voldmar.ya.ru):

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

isagalaev (softwaremaniacs.org/about/)
17 сентября 2008, 13:06

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

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

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

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

VasT (vast.myopenid.com)
17 сентября 2008, 23:11

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

bolk (bolknote.ru)
18 сентября 2008, 09:47, ответ предназначен VasT (vast.myopenid.com):

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

sl37.livejournal.com (sl37.livejournal.com)
18 сентября 2008, 11:58

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

bolk (bolknote.ru)
18 сентября 2008, 13:26, ответ предназначен sl37.livejournal.com:

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

bolk (bolknote.ru)
18 сентября 2008, 14:31, ответ предназначен isagalaev (softwaremaniacs.org/about/):

В итоге, стало так:

return list(
            chain(
                *(
                    [[''], grp][item or len(grp)<n]
                        for item, grp in ((bool(item), list(grp))
                            for item, grp in groupby(chain(['']*n, letter, ['']*n), lambda x:x))
                )
                )
        )[replby:-replby]

Больше менять не буду :)

thebobuk (thebobuk.ya.ru)
19 сентября 2008, 02:50

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

bolk (bolknote.ru)
19 сентября 2008, 09:17, ответ предназначен thebobuk (thebobuk.ya.ru):

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

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)