Ce court billet vous présente comment traiter les entrées d’un défi lorsque celles-ci sont proposées sous la forme d’un gros bloc de texte (contenant par exemple des coordonnées de points du plan).
On va s’intéresser ici au cas hypothétique où les entrées sont des points du plans, et sont décrits par leurs coordonnées cartésienne, sous cette forme :
14.6, 10.5
11.2, 11.5
20.5, -5.7
2.0, -1.4
...
3.1, 2.6
Les entrées sont donnés sous la forme d’une longue chaîne de caractères de plusieurs lignes (affichés dans une page Web).
Le traitement des entrées (en Python) se fait en trois temps :
- premièrement on récupère la grande chaîne de caractères
pour l’insérer dans son code en tant que chaîne
multi-lignes encadrée entre
"""
(triple guillemets) - puis dans le code python on découpe cette longue chaîne de caractères en une
liste de ligne en utilisant la méthode
split
. - enfin la chaîne de caractères correspondant à chaque ligne est traitée
et transformée en objet facilement manipulable. Dans notre cas puisque chaque ligne correspond à
un point du plan on
choisit de transformer chaque ligne en couple (
tuple
) de nombres flottants. Pour faire ceci on utilise à nouveau la méthodesplit
Récupération de la chaîne de caractères
Un simple copié/collé suffit :
donnees = """\
14.6, 10.5
11.2, 11.5
20.5, -5.7
2.0, -1.4
...
3.1, 2.6"""
Notez tout de même le \
après les 3 guillemets qui évite que la première ligne
soit vide. Ne copiez pas les ...
bien sûr…
Découpage des lignes
On utilise la méthode split
en indiquant qu’on veut couper sur les passages à
la ligne (caractère \n
) :
lignes = donnees.split("\n")
La variable lignes
est maintenant une liste qui contient autant de chaînes
qu’il y a de lignes dans les données initiales.
Par exemple :
>> print(lignes[0])
'14.6, 10.5'
Si on a des lignes vides parasites, on peut les supprimer ainsi par exemple :
lignes = [ligne.strip() for ligne in donnees.split("\n") if ligne.strip()]
Ici, on ne garde que les lignes non vides, et on supprime aussi les espaces parasites en début et fin de ligne.
Découpage des coordonnées
Pour chaque ligne, on réutilise split
, sur la virgule, et on convertit les
données en float
:
data = []
for ligne in lignes:
ligne_num = [float(d) for d in ligne.split(",")]
data.append(tuple(ligne_num))
À présent, data
est une liste de tuples de floats :
[(14.6, 10.5), (11.2, 11.5), (20.5, -5.7), (2.0, -1.4), (3.1, 2.6)]
Ou avec le module csv
Le module csv
fait partie de la bibliothèque standard Python. Pour des entrées
du type de celle envisagées ici, ce module fait aussi l’affaire, même si ça ne
me semble pas particulièrement plus simple. Lien vers la doc du module csv