LINUX.ORG.RU

Короче есть два итератора

 , ,


1

3

Точнее один, а хочется сделать из него два, так чтобы один отдавал элементы, которые удовлетворяют условию, а во второй, которые не.

Проблемы дважды пройтись по исходному списку нет, но хочется пройтись только один раз. Как бы такое организовать.

Поделитесь мыслями, свои закончились.

★★★★★

Последнее исправление: ya-betmen (всего исправлений: 2)

финалити:

from itertools import count
def mkspli(ita,fu,tbl):
    tbl=list(tbl)
    bufs=dict(zip(tbl,([]for _ in count())))
    def mkItFor(k):
        def itForK():
            while 1:
                while not bufs[k]:
                        try:
                            v=next(ita)
                            bufs[fu(v)].append(v)
                        except Exception as e :
                            print(e)
                            return 
                res,*bufs[k]=bufs[k]
                yield res
        return itForK
    its={k:mkItFor(k)() for k in tbl}
    return its

тестик:


def tblN(N):
  for q in mkspli(iter(range(N*N+1)),lambda x:x%N,range(N)).values():print(*q,end='')

for i in range(11):tblN(i)

qulinxao3 ★☆
()

чисто для визии что балансы балансятся:

тестовая сесcия на кратные и не; со своим болтливым range:


def z(N):
    for i in range(N):
        print(f'z:{i}')
        yield i
def viewZ(N):
    return mkspli(iter(z(N*N+1)),lambda x:bool(x%N),range(2)).values()
kra,non=viewZ(4)
for i in range(7):print(f'non:{next(non)}')
for _ in range(4):print(f'kra:{next(kra)}')

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

упс лишняя была обёртка:

def mkspli(ita,fu,tbl):
    bufs=__import__('collections').defaultdict(list)
    def itForK(k):
        while 1:
            while not bufs[k]:
                    try:  bufs[fu(v:=next(ita))].append(v)
                    except Exception as e : print(e);return 
            yield bufs[k].pop(0)
    return {k:itForK(k) for k in tbl}
#тостик1:
def tblN(N):
  for q in mkspli(iter(range(N*N+1)),lambda x:x%N,range(N)).values():print(*q,end='')
for i in range(11):tblN(i)
#тесто2:
def z(N):
    for i in range(N):print(f'z:{i}');yield i
def viewZ(N):
    return mkspli(z(N*N+1),lambda x:bool(x%N),range(2)).values()
kra,non=viewZ(4)
for i in range(7):print(f'non:{next(non)}')
for _ in range(4):print(f'kra:{next(kra)}')

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