2. Selecció d’elements (5 punts)

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 no es poden fer servir llistes, tuples, diccionaris ni cap altra estructura de dades per a desar els elements d’un iterador.

Es demana que, en un fitxer anomenat selelem.py, hi deseu la funció especificada a continuació:

selelem.selelem(it1, it2)
Paràmetres:
  • it1 – iterable qualsevol.

  • it2 – iterable de valors booleans. .

Retorna:

un iterador que apareixen només els elements de it1 que per posició coincideixen amb els valors True de it2. Si it2 és més curt que it1, els valors de it1 que estan en una posició més enllà de la darrera posició de it2 no apareixeran.

Per exemple:

>>> seleccio = [True, False, False, True, True, False, True]
>>> nombres  = [   0,     1,     2,    3,    4,     5,    6,    7,    8,   9]
>>> # resultat:    0                   3     4            6
>>> exemple = selelem(nombres, seleccio)
>>> for n in exemple:
...     print(n, end='·')
... 
0·3·4·6·
>>> sel = itertools.cycle([True, False, False, True])
>>> nombres = itertools.count(10)
>>> exemple = selelem(nombres, sel)
>>> for i in range(10):
...     print(next(exemple), end='·')
... 
10·13·14·17·18·21·22·25·26·29·

>>> sel= (True, False, False, False, False, False, False, True )
>>> for n in selelem(range(100), sel):
...     print(repr(n), end='·')
0·7·
>>> sel= (n % 7 == 0 for n in range(100))
>>> for c in selelem('Avinguda Diagonal, 647 08029 Barcelona', sel):
...     print(repr(c), end='·')
'A'·'a'·'n'·'7'·' '·'o'·

Disposeu d’un joc de proves més complet al fitxer tests-selelem.txt