Comparació de seqüències ADN ============================ .. py:module:: adn .. warning:: Per a resoldre aquest exercici **no es poden fer servir iteracions (ni** ``for`` **ni** ``while`` **)**, només les :ref:`funcions predefinides ` de Python i les dels mòduls :py:mod:`itertools`, :py:mod:`functools` i :py:mod:`operator`. **Tampoc es poden fer servir llistes**, tuples, diccionaris ni cap altra estructura de dades **per a desar tots els elements dels iterables**. L'`alineament de seqüències `__ és un important problema de la bioinformàtica, consistent en comparar dues o més seqüències o cadenes d'ADN o ARN per ressaltar les seves zones de similitud. Lluny de resoldre el problema de l'alineament, ens volem ocupar de la comparació de seqüències d'ADN. Suposarem que partim de dues seqüències d'ADN o ARN, representades com cadenes de caràcters. Ambdues cadenes tenen la mateixa longitud i estan formades únicament pels caràcters ``'A', 'T', 'C', 'G', 'U'`` (cada caràcter indica una de les bases de l'ADN o ARN: adenina, timina, citosina, guanina, uracil). L'objectiu és saber com de semblants són aquestes dues seqüències. Deseu al fitxer :file:`adn.py` les funcions següents: #. Dissenyeu la funció següent: .. py:function:: fusiona(it1, it2) A partir de dos iterables *it1* i *it2* que produeixen dues seqüències com les que s'acaben de descriure, retorna un iterador amb la seqüència resultant de la comparació de les dues originals. Cada element i-èssim de l'iterador generat ha de ser o bé el mateix que els elements i-èssims de les dues seqüències originals, si aquests coincideixen, o bé el caràcter ``'*'``, si són diferents: .. literalinclude:: adn-1.txt :language: python :lines: 1,3,8-18 Per a resoldre aquest apartat es recomana utilitzar la funció :py:func:`map`. #. Dissenyeu la funció següent: .. py:function:: sense_asteriscs(it) A partir de l'iterable *it* que genera una seqüència de caràcters, retorna un iterador amb la mateixa seqüència que l'original però en la qual s'han eliminat els caràcters ``'*'``: .. literalinclude:: adn-1.txt :language: python :lines: 21,23,28-38 Per a resoldre aquest apartat es recomana utilitzar la funció :py:func:`filter`. #. Dissenyeu la funció següent: .. py:function:: iter_a_cadena(it) A partir de l'iterador *it* que genera una seqüència de caràcters, retorna la cadena de caràcters (string) corresponent a la seqüència: .. literalinclude:: adn-1.txt :language: python :lines: 40,42-51 Per a resoldre aquest apartat es recomana que utilitzeu el mètode :py:meth:`str.join`. Una alternativa és utilitzar :py:func:`functools.reduce` i el mòdul :py:mod:`operator`. #. Dissenyeu la funció següent: .. py:function:: dues_cadenes(a, b) Donades dues cadenes de caràcters de la mateixa longitud, *a* i *b* retorna dues altres cadenes: la corresponent a la fusió de *a* i *b* amb asteriscs i la corresponent a la fusió de *a* i *b* sense els asteriscs: .. literalinclude:: adn-1.txt :language: python :lines: 54, 56-57 Per a resoldre aquest apartat caldrà que utilitzeu tot el que heu fet anteriorment. També us pot ser útil la funció :py:func:`itertools.tee`. Disposeu de jocs de prova en els fitxers :download:`adn-1.txt` i :download:`adn-2.txt` i una solució a :download:`adn.py `.