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
.