3.7. Jointure de listes et découpage de chaînes
Nous avons une liste de paires clé-valeur sous la forme
clé=valeur et nous voulons les assembler au sein
d'une même chaîne. Pour joindre une liste de chaînes en une seule,
nous pouvons utiliser la méthode join d'un objet chaîne.
Une remarque intéressante avant de continuer. Je ne cesse de
répéter que les fonctions sont des objets, que les chaînes sont des
objets, que tout est objet. Vous pourriez penser que seules les
variables de type chaîne sont des objets. Mais ce
n'est pas le cas, regardez de plus près cet exemple et vous verrez que
la chaîne ";" est elle même un objet dont vous
appelez la méthode join.
La méthode join assemble les éléments d'une
liste pour former une chaîne unique, chaque élément étant séparé par un
point virgule. Le séparateur n'est pas forcément un point-virgule, il
n'est même pas forcément un caractère unique. Il peut être n'importe
quelle chaîne.
 |
| La méthode join ne fonctionne qu'avec des
listes de chaînes; elle n'applique pas la conversion de types. La
jointure d'une liste comprenant au moins un
élément non-chaîne déclenchera une exception.
|
Exemple 3.27. Sortie de odbchelper.py
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}
>>> ["%s=%s" % (k, v) for k, v in params.items()]
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> ";".join(["%s=%s" % (k, v) for k, v in params.items()])
'server=mpilgrim;uid=sa;database=master;pwd=secret'
La chaîne est alors retournée de la fonction odbchelper et affichée par le bloc appelant, ce qui vous donne la sortie qui vous a tant émerveillé quand vous avez débuté la lecture
de ce chapitre.
Vous vous demandez probablement s'il existe une méthode analogue
permettant de découper une chaîne en liste. Et bien sur elle existe,
elle porte le nom de split.
Exemple 3.28. Découpage d'une chaîne
>>> li = ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> s = ";".join(li)
>>> s
'server=mpilgrim;uid=sa;database=master;pwd=secret'
>>> s.split(";")
['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
>>> s.split(";", 1)
['server=mpilgrim', 'uid=sa;database=master;pwd=secret']
|
split fait l'inverse de join en découpant une chaîne en une liste de plusieurs éléments. Notez que le délimiteur («;») est totalement supprimé, il n'apparaît dans aucun des éléments de la liste retournée.
|
|
split prend en deuxième argument optionnel le nombre de découpages à effectuer («Des arguments optionnels ?» Vous apprendrez à en définir dans vos propres fonctions au prochain chapitre.)
|
 |
| une_chaîne.split(delimiteur, 1) est une technique utile pour chercher une sous-chaîne dans une chaîne et utiliser tout ce qui précède cette sous-chaîne (le
premier élément de la liste retournée) et tout ce qui la suit (le second élément de la liste retournée).
|
Pour en savoir plus sur les méthodes de chaînes
3.7.1. Note historique sur les méthodes de chaînes
Lorsque j'ai débuté l'apprentissage de
Python, je m'attendais à ce que
join soit une méthode de liste qui aurait pris un
séparateur comme argument. Beaucoup de gens pensent la même chose et
il y a une véritable histoire derrière la méthode
join. Avant Python
1.6, les chaînes n'étaient pas pourvue de toutes ces méthodes si
utiles. Il y avait un module string séparé qui contenait toutes les
fonctions de manipulation de chaînes de caractères, chacune prenant
une chaîne comme premier argument. Ces fonctions ont été considérées
assez importantes pour être intégrées dans les chaînes elles même, ce
qui semblait logique pour des fonctions comme
lower, upper et
split. Mais beaucoup de programmeurs
Python issus du noyau dur émirent des
objections quant à la méthode join en arguant du
fait qu'elle devrait être plutôt une méthode de liste ou tout
simplement rester une fonction du module string (qui contient encore bien des
choses utiles). J'utilise exclusivement la nouvelle méthode
join mais vous verrez du code écrit des deux
façons et si cela vous pose un réel problème, vous pouvez toujours
opter pour l'ancienne fonction
string.join.