есть например вот такой код:
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))