LINUX.ORG.RU

как бы за итерейтить

 , , ,


0

2

есть например вот такой код:

s=0
while e:
	s+=z[e]
	e-=e&(-e)
return s

охота его сделать вот похожим на такое:

return sum(z[x] for x in until(e,eval('(e:=e-(e&(-e)))')))

пока получается костыльно:

w=[e]
return z[e] + sum(z[w[-1]]for _ in takewhile(lambda _:(w.append(w[-1]-(w[-1]&(-w[-1]))),w[-1])[-1],count()))

охота одностроком просуммировать элементы массива по индексу пока не ноль как вот ?

!upd!(решено):

from more_itertools import iterate
return sum(z[e]for e in takewhile(int,iterate(lambda e:e-(e&(-e)),e)))

!upd2!: наткнулся на ещё более идиоматичное:


from more_itertools import iterate
from operator import itemgetter
return sum(itemgetter(takewhile(int,iterate(lambda e:e-(e&(-e)),e)))(z))


Последнее исправление: qulinxao3 (всего исправлений: 3)

А начальное значение e в первом варианте какое?

одностроком просуммировать элементы массива по индексу пока не ноль как вот ?

Взять срез до index(0)? Красиво кмк один фиг не сделать.

Или пока странный прыгающий индекс не ноль? Тогда надо сначала сгенерить одностроком последовательность индексов.

AntonI ★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

ну да

как бы скрестить takewhile результат первого аргумента (функции)и последовательности результатов с начального e

т.е: e,f(e),f(f(e)), ... , до 0 не включая - accumulate не придумывается - странно что пока в питоне в библиотеке нет генераторных последовательностей на рекуррентностях ( тут от одного последнего)

qulinxao3
() автор топика
Последнее исправление: qulinxao3 (всего исправлений: 1)
Ответ на: комментарий от AntonI

Оказалось https://docs.python.org/3/library/itertools.html#itertools.takewhile

там ссыль на more-itertools https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.befor...

а уже там : https://more-itertools.readthedocs.io/en/stable/api.html#more_itertools.iterate

iterate :

получилось вот так :

 sum(z[e]for e in takewhile(int,iterate(lambda e:e-(e&(-e)),e)))

qulinxao3
() автор топика

!upd!(решено)

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

Virtuos86 ★★★★★
()

а теперь возьми получившуюся хрень с мусорной зависимостью, попробуй заставить ее печатать e и z[e] на каждой итерации (хотя бы чисто для отладки), и осознай, что хотелки функциональщиков не имеют никакого отношения к реальному программированию :)

Lrrr ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Зачем они делают однострочно-ламбдовые извращения, это повышает производительность?

Ага, их ЧСВ 😄. Там itemgetter вообще класс, pure python причем, даже не сишный модуль. Быстрее обычного цикла это быть никак не может.

Virtuos86 ★★★★★
()

Был нормальный код, ты зачем его в этот ужас переписал? Джунов боишься и пытаешься писать так чтоб никто кроме тебя без поллитра не мог разобраться?

anonymous
()