J'ai un tuple de tuples provenant d'une requête MySQL comme ceci :
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
Je voudrais convertir tous les éléments de la chaîne en nombres entiers et les remettre dans une liste de listes :
T2 = [[13, 17, 18, 21, 32], [7, 11, 13, 14, 28], [1, 5, 6, 8, 15, 16]]
J'ai essayé de le faire avec eval
mais je n'ai pas encore obtenu de résultat satisfaisant.
int()
est la fonction intégrée standard de Python pour convertir une chaîne de caractères en une valeur entière. Vous l'appelez avec une chaîne de caractères contenant un nombre comme argument, et elle retourne le nombre converti en entier :
print (int("1") + 1)
L'exemple ci-dessus imprime 2
.
Si vous connaissez la structure de votre liste, T1 (qu'elle contient simplement des listes, à un seul niveau), vous pourriez faire ceci en Python 2 :
T2 = [map(int, x) for x in T1]
En Python 3 :
T2 = [list(map(int, x)) for x in T1]
Vous pouvez le faire avec une compréhension de liste :
T2 = [[int(column) for column in row] for row in T1]
La compréhension de liste interne ([int(column) for column in row]
) construit une liste
de int
s à partir d'une séquence d'objets int
-ables, comme des chaînes décimales, dans row
. L'interpréteur de liste externe ([... for row in T1])
) construit une liste des résultats de l'interpréteur de liste interne appliqué à chaque élément de T1
.
L'extrait de code échouera si l'une des lignes contient des objets qui ne peuvent pas être convertis par int
. Vous aurez besoin d'une fonction plus intelligente si vous voulez traiter des lignes contenant des chaînes de caractères non décimales.
Si vous connaissez la structure des lignes, vous pouvez remplacer la compréhension de la liste interne par un appel à une fonction de la ligne. Par exemple.
T2 = [parse_a_row_of_T1(row) for row in T1]
Si ce n'est qu'un tuple de tuples, quelque chose comme rows=[map(int, row) for row in rows]
fera l'affaire. (Il y a là une compréhension de liste et un appel à map(f, lst), qui est égal à [f(a) for a in lst]).
Eval n'est pas ce que vous voulez faire, au cas où il y aurait quelque chose comme __import__("os" ;).unlink("importantsystemfile" ;)
dans votre base de données pour une raison quelconque.
Validez toujours votre entrée (si vous n'avez rien d'autre, l'exception int() sera levée si vous avez une mauvaise entrée).