Chapitre 9 : Plus sur les chaînes de caractères

         1 – Préambule

    Nous avons déjà abordé les chaînes de caractères dans le chapitre variables et écriture. Ici nous allons un peu plus loin notamment avec les méthodes associées aux chaînes de caractères. Notez qu’il existe un module string mais qui est maintenant considéré comme obsolète depuis la version 2.5 de Python.

         2 – Chaînes de caractères et listes

    Les chaînes de caractères peuvent être considérées comme des listes.

Code python

>>> animaux = « girafe tigre »
>>> animaux
‘girafe tigre’
>>> len(animaux)
12
>>> animaux[3]
‘a’
Nous pouvons donc utiliser certaines propriétés des listes comme les tranches :

Code python

>>> animaux = « girafe tigre »
>>> animaux[0:4]
‘gira’
>>> animaux[9:]
‘gre’
>>> animaux[:-2]
‘girafe tig’
A contrario des listes, les chaînes de caractères présentent toutefois une différence notable, ce sont des listes non modifiables. Une fois définie, vous ne pouvez plus modifier un de ses éléments. Le cas échéant, Python renvoie un message d’erreur :

Code python

>>> animaux = « girafe tigre »
>>> animaux[4]
‘f’
>>> animaux[4] = « F »
Traceback (most recent call last):
File « <stdin> », line 1, in <module>
TypeError: ‘str’ object does not support item assignment
Par conséquent, si vous voulez modifier une chaîne, vous êtes obligés d’en construire une nouvelle. Pour cela, n’oubliez pas que les opérateurs de concaténation (+) et de duplication (*) (cf chapitre variables et écriture) peuvent vous aider. Vous pouvez également générer une liste, qui elle est modifiable, puis revenir à une chaîne.

         3 – Caractères spéciaux

    Il existe certains caractères spéciaux comme le n que nous avons déjà vu (pour le retour à la ligne). Le t vous permet d’écrire une tabulation. Si vous voulez écrire un guillemet simple ou double (et que celui-ci ne soit pas confondus avec les guillemets de déclaration de la chaîne de caractères), vous pouvez utiliser ‘ ou  » ou utiliser respectivement des guillements doubles ou simple pour déclarer votre chaîne de caractères.

Code python

>>> print « Un retour a la lignenpuis une tabulationt, puis un guillemet » »
Un retour a la ligne
puis une tabulation , puis un guillemet »
>>> print ‘J’imprime un guillemet simple’
J’imprime un guillemet simple
>>> print « Un brin d’ADN »
Un brin d’ADN
>>> print ‘Python est un « super » langage’
Python est un « super » langage
Lorsqu’on souhaite écrire un texte sur plusieurs lignes, il est très commode d’utiliser les guillemets triples permettant de conserver le formatage (notamment les retours à la ligne):

Code python

>>> x =  »’souris
… chat
… abeille »’
>>> x
‘sourisnchatnabeille’
>>> print x
souris
chat
abeille

         4 – Méthodes associées aux chaînes de caractères

    Voici quelques méthodes spécifiques aux objets de type string :

Code python

>>> x = « girafe »
>>> x.upper()
‘GIRAFE’
>>> x
‘girafe’
>>> ‘TIGRE’.lower()
‘tigre’
Les fonctions lower() et upper() passent un texte en minuscule et en majuscule respectivement. On remarque que l’utilisation de ces fonctions n’altèrent pas la chaîne de départ mais renvoie la chaîne transformée.

Pour mettre en majuscule la première lettre seulement, vous pouvez faire :

Code python

>>> x[0].upper() + x[1:]
‘Girafe’
ou encore plus simple avec la fonction Python adéquate :

>>> x.capitalize()
‘Girafe’

Il existe une méthode associée aux chaînes de caractères qui est particulièrement pratique, la fonction split() :

Code python

>>> animaux = « girafe tigre singe »
>>> animaux.split()
[‘girafe’, ‘tigre’, ‘singe’]
>>> for i in animaux.split():
… print i

girafe
tigre
singe
La fonction split() découpe la ligne en champs, en utilisant comme séparateur les espaces ou les tabulations. Il est possible de modifier le séparateur de champs, par exemple :

Code python

>>> animaux = « girafe:tigre:singe »
>>> animaux.split(« : »)
[‘girafe’, ‘tigre’, ‘singe’]

La fonction find() recherche une chaîne de caractères passée en argument.

Code python

>>> animal = « girafe »
>>> animal.find(‘i’)
1
>>> animal.find(‘afe’)
3
>>> animal.find(‘tig’)
-1
Si l’élément recherché est trouvé, alors l’indice du début de l’élément dans la chaîne de caractères est renvoyé. Si l’élément n’est pas trouvé, alors la valeur -1 est renvoyée.

Si l’élément recherché est trouvé plusieurs fois, seul l’indice de la première occurence est retourné :

Code python

>>> animaux = « girafe tigre »
>>> animaux.find(« i »)
1

On trouve aussi la fonction replace(), qui serait l’équivalent de la fonction de substitution de la commande Unix sed :

Code python

>>> animaux = « girafe tigre »
>>> animaux.replace(« tigre », « singe »)
‘girafe singe’
>>> animaux.replace(« i », « o »)
‘gorafe togre’

Enfin, la fonction count() compte le nombre d’occurences d’une chaîne de caractères passée en argument :

Code python

>>> animaux = « girafe tigre »
>>> animaux.count(« i »)
2
>>> animaux.count(« z »)
0
>>> animaux.count(« tigre »)
1

         5 – Conversion de types

    Dans tout langage de programmation, on est souvent amené à convertir les types, c’est-à-dire passer d’un type numérique à une chaîne de caractères ou vice-versa. En Python, rien de plus simple avec les fonctions int(), float() et str(). Pour vous en convaincre, regardez ces exemples :

Code python

>>> i = 3
>>> str(i)
‘3’
>>> i = ‘456’
>>> int(i)
456
>>> float(i)
456.0
>>> i = ‘3.1416’
>>> float(i)
3.1415999999999999
Ces conversions sont essentielles lorsqu’on lit ou écrit des nombres dans un fichier. En effet, les nombres dans un fichier sont considérés comme du texte par la fonction readlines(), par conséquent il faut les convertir si on veut effectuer des opérations numériques dessus.

         6 – Conversion d’une liste de chaînes de caractères en une chaîne de caractères

    La conversion d’une liste de chaînes de caractères en une chaîne de caractères est un peu particulière puisqu’elle fait appelle à la fonction join().

Code python

>>> seq = [« A », « T », « G », « A », « T »]
>>> seq
[‘A’, ‘T’, ‘G’, ‘A’, ‘T’]
>>> « -« .join(seq)
‘A-T-G-A-T’
>>>  » « .join(seq)
‘A T G A T’
>>> «  ».join(seq)
‘ATGAT’
Les éléments de la liste initiale sont concaténés les uns à la suite des autres et intercalés par un séparateur qui peut être n’importe quelle chaîne de caractères (ici, nous avons utilisé un tiret, un espace et rien).

Attention, la fonction join() ne s’applique qu’à une liste de chaînes de caractères.

Code python

>>> maliste = [« A », 5, « G »]
>>>  » « .join(maliste)
Traceback (most recent call last):
File « <stdin> », line 1, in <module>
TypeError: sequence item 1: expected string, int found
Nous espérons qu’après ce petit tour d’horizon vous serez convaincu de la richesse des méthodes associées aux chaînes de caractères. Pour avoir une liste exhaustive de l’ensemble des méthodes associées à une variable particulière, vous pouvez utiliser la commande dir().

Code python

>>> dir(animaux)
[‘__add__’, ‘__class__’, ‘__contains__’, ‘__delattr__’, ‘__doc__’, ‘__eq__’, ‘__ge__’,
‘__getattribute__’, ‘__getitem__’, ‘__getnewargs__’, ‘__getslice__’, ‘__gt__’,
‘__hash__’, ‘__init__’, ‘__le__’, ‘__len__’, ‘__lt__’, ‘__mod__’, ‘__mul__’, ‘__ne__’,
‘__new__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__rmod__’, ‘__rmul__’,
‘__setattr__’, ‘__str__’, ‘capitalize’, ‘center’, ‘count’, ‘decode’, ‘encode’,
‘endswith’, ‘expandtabs’, ‘find’, ‘index’, ‘isalnum’, ‘isalpha’, ‘isdigit’, ‘islower’,
‘isspace’, ‘istitle’, ‘isupper’, ‘join’, ‘ljust’, ‘lower’, ‘lstrip’, ‘partition’,
‘replace’, ‘rfind’, ‘rindex’, ‘rjust’, ‘rpartition’, ‘rsplit’, ‘rstrip’, ‘split’,
‘splitlines’, ‘startswith’, ‘strip’, ‘swapcase’, ‘title’, ‘translate’, ‘upper’,
‘zfill’]
Pour l’instant vous pouvez ignorer les méthodes qui commencent et qui se terminent par deux tirets bas (underscores) «__ ».

Vous pouvez ensuite accéder à l’aide et à la documentation d’une fonction particulière avec help() :

Code python

>>> help(animaux.split)
Help on built-in function split:

split(…)
S.split([sep [,maxsplit]]) -> list of strings

Return a list of the words in the string S, using sep as the
delimiter string. If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator.
(END)La conversion d’une liste de chaînes de caractères en une chaîne de caractères est un peu particulière puisqu’elle fait appelle à la fonction join().

Code python

>>> seq = [« A », « T », « G », « A », « T »]
>>> seq
[‘A’, ‘T’, ‘G’, ‘A’, ‘T’]
>>> « -« .join(seq)
‘A-T-G-A-T’
>>>  » « .join(seq)
‘A T G A T’
>>> «  ».join(seq)
‘ATGAT’
Les éléments de la liste initiale sont concaténés les uns à la suite des autres et intercalés par un séparateur qui peut être n’importe quelle chaîne de caractères (ici, nous avons utilisé un tiret, un espace et rien).

Attention, la fonction join() ne s’applique qu’à une liste de chaînes de caractères.

Code python

>>> maliste = [« A », 5, « G »]
>>>  » « .join(maliste)
Traceback (most recent call last):
File « <stdin> », line 1, in <module>
TypeError: sequence item 1: expected string, int found
Nous espérons qu’après ce petit tour d’horizon vous serez convaincu de la richesse des méthodes associées aux chaînes de caractères. Pour avoir une liste exhaustive de l’ensemble des méthodes associées à une variable particulière, vous pouvez utiliser la commande dir().

Code python

>>> dir(animaux)
[‘__add__’, ‘__class__’, ‘__contains__’, ‘__delattr__’, ‘__doc__’, ‘__eq__’, ‘__ge__’,
‘__getattribute__’, ‘__getitem__’, ‘__getnewargs__’, ‘__getslice__’, ‘__gt__’,
‘__hash__’, ‘__init__’, ‘__le__’, ‘__len__’, ‘__lt__’, ‘__mod__’, ‘__mul__’, ‘__ne__’,
‘__new__’, ‘__reduce__’, ‘__reduce_ex__’, ‘__repr__’, ‘__rmod__’, ‘__rmul__’,
‘__setattr__’, ‘__str__’, ‘capitalize’, ‘center’, ‘count’, ‘decode’, ‘encode’,
‘endswith’, ‘expandtabs’, ‘find’, ‘index’, ‘isalnum’, ‘isalpha’, ‘isdigit’, ‘islower’,
‘isspace’, ‘istitle’, ‘isupper’, ‘join’, ‘ljust’, ‘lower’, ‘lstrip’, ‘partition’,
‘replace’, ‘rfind’, ‘rindex’, ‘rjust’, ‘rpartition’, ‘rsplit’, ‘rstrip’, ‘split’,
‘splitlines’, ‘startswith’, ‘strip’, ‘swapcase’, ‘title’, ‘translate’, ‘upper’,
‘zfill’]
Pour l’instant vous pouvez ignorer les méthodes qui commencent et qui se terminent par deux tirets bas (underscores) «__ ».

Vous pouvez ensuite accéder à l’aide et à la documentation d’une fonction particulière avec help() :

Code python

>>> help(animaux.split)
Help on built-in function split:

split(…)
S.split([sep [,maxsplit]]) -> list of strings

Return a list of the words in the string S, using sep as the
delimiter string. If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator.
(END)

         7 – Exercices

    Conseil : pour ces exercices, écrivez des scripts dans des fichiers, puis exécutez-les dans un shell.

Soit la liste [‘girafe’, ‘tigre’, ‘singe’, ‘souris’]. Avec une boucle, affichez chaque élément ainsi que sa taille (nombre de caractères).
Soit la séquence nucléique ATATACGGATCGGCTGTTGCCTGCGTAGTAGCGT. Calculez la fréquence de chaque base dans cette séquence.
Soit la séquence protéique ALA GLY GLU ARG TRP TYR SER GLY ALA TRP. Transformez cette séquence en une chaîne de caractères en utilisant le code une lettre pour les acides aminés.
Distance de Hamming.
La distance de Hamming mesure la différence entre deux séquences de même taille en sommant le nombre de positions qui, pour chaque séquence, ne correspondent pas au même acide aminé. Calculez la distance de Hamming pour les séquences AGWPSGGASAGLAIL et IGWPSAGASAGLWIL.

Palindrome.
Un palindrome est un mot ou une phrase dont l’ordre des lettres reste le même si on le lit de gauche à droite ou de droite à gauche. Par exemple, «ressasser »et «Engage le jeu que je le gagne » sont des palindromes.

Écrivez un script qui détermine si une chaîne de caractères est un palindrome. Pensez à vous débarasser des majuscules et des espaces. Testez si les expressions suivantes sont des palindromes : «Radar », «Never odd or even », «Karine alla en Iran », «Un roc si biscornu ».

Mot composable.
Un mot est composable à partir d’une séquence de lettres si la séquence contient toutes les lettres du mot. Comme au Scrabble, chaque lettre de la séquence ne peut être utilisée qu’une seule fois. Par exemple, coucou est composable à partir de uocuoceokzefhu.

Écrivez un script qui permet de savoir si un mot est composable à partir d’une séquence de lettres. Testez le avec différents mots et séquences.

Remarque : dans votre script, le mot et la séquence de lettres seront des chaînes de caractères.

Alphabet et pangramme.
Les codes ASCII des lettres minuscules de l’alphabet vont de 97 (lettre a) à 122 (lettre z). La fonction chr() prend en argument un code ASCII sous forme d’une entier et renvoie le caractère correspondant. Ainsi chr(97) renvoie ‘a’, chr(98) renvoie ‘b’ et ainsi de suite.

Écrivez un script qui construit une chaîne de caractères contenant toutes les lettres de l’alphabet.

Un pangramme est une phrase comportant au moins une fois chaque lettre de l’alphabet. Par exemple, «Portez ce vieux whisky au juge blond qui fume »est un pangramme.

Modifiez le script précédent pour déterminer si une chaîne de caractères est un pangramme ou non. Pensez à vous débarasser des majuscules le cas échéant. Testez si les expressions suivantes sont des pangrammes : «Monsieur Jack vous dactylographiez bien mieux que votre ami Wolf », «Buvez de ce whisky que le patron juge fameux ».

Téléchargez le fichier pdb 1BTA dans votre répertoire. Faites un script qui récupère seulement les carbones alpha et qui les affiche à l’écran.
En vous basant sur le script précédent, affichez à l’écran les carbones alpha des deux premiers résidus. Toujours avec le même script, calculez la distance inter atomique entre ces deux atomes.
En vous basant sur le script précédent, calculez les distances entre carbones alpha consécutifs. Affichez ces distances sous la forme
numero_calpha_1 numero_calpha_2 distance
À la fin du script, faites également afficher la moyenne des distances. La distance inter carbone alpha dans les protéines est très stable et de l’ordre de 3,8 angströms. Observez avec attention les valeurs que vous avez obtenues. Expliquez l’anomalie détectée.