Separar i ajuntar iteradors

Avís

Per a resoldre aquest exercici no es poden fer servir iteracions (ni for ni while ), només les funcions predefinides de Python i les dels mòduls itertools, functools i operator. Tampoc es poden fer servir llistes, tuples, diccionaris ni cap altra estructura de dades per a desar tots els elements dels iterables.

Separar un iterador

Al mòdul separar.py, dissenyeu la funció següent:

separar.split_iter(it, f)

Donat un iterador it i una funció booleana f (un predicat), retorna dos altres iteradors, corresponents a la separació de la seqüència produïda per it en funció de l’avaluació de la funció f sobre cadascun dels elements de la seqüència. És a dir, el primer iterador retornat ha de produïr la seqüència dels elements e de it pels quals f(e) és True, mentre que el segon iterador retornat ha de produir la seqüència dels elements e de it pels quals f(e) és False, sempre en el mateix ordre que en la seqüència original.

Per exemple:


>>> it = iter([1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> ita, itb = split_iter(it, lambda x: x%2==0)
>>> list(ita)
[2, 4, 6, 8]
>>> list(itb)
[1, 3, 5, 7, 9]

Per a resoldre aquest exercici es recomana fer servir les funcions itertools.tee(), filter() i itertools.filterfalse().

Disposeu de jocs de proves addicionals al fitxer test_split.txt i una solució a separar.py.

Ajuntar dos iteradors

Al mòdul ajuntar.py, dissenyeu la funció següent:

ajuntar.join_iters(it1, it2)

Donats dos iteradors it1 i it2, retorna un iterador que genera la seqüència resultat d’intercalar els elements de la seqüència produïda per it1 amb els de la seqüència produïda per it2, alternadament. El nombre d’elements de la seqüència que genera l’iterador retornat ha de ser igual al doble del mínim nombre d’elements de it1 i it2.

Per exemple:


>>> it1 = iter('0123456789')
>>> it2 = iter('abcdefghijklmnopqrstuvwxyz')
>>> it3 = join_iters(it1, it2)
>>> for x in it3:
...    print(x, end='-')
0-a-1-b-2-c-3-d-4-e-5-f-6-g-7-h-8-i-9-j-

Per a resoldre aquest exercici es recomana fer servir les funcions zip() i itertools.chain.from_iterable().

Disposeu de jocs de proves addicionals al fitxer test_join.txt i d’una solució a ajuntar.py.