J'ai un tuple de tuples 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 chaîne en 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é d'y parvenir eval
mais je n'ai pas encore obtenu de résultat décent.
Réponses:
int()
est la fonction intégrée standard de Python pour convertir une chaîne en une valeur entière. Vous l'appelez avec une chaîne contenant un nombre comme argument, et il retourne le nombre converti en entier:Les impressions ci-dessus
2
.Si vous connaissez la structure de votre liste, T1 (qu'elle contient simplement des listes, un seul niveau), vous pouvez le faire en Python 2:
En Python 3:
la source
T2 = map(lambda lol: map(int, lol), T1)
? Soit carte ou liste compréhensions, les deux est stupide;)Vous pouvez le faire avec une liste de compréhension:
La liste intérieure comprehension (
[int(column) for column in row]
) construit unlist
deint
s à partir d'une séquence d'int
objets -able, comme des chaînes décimales, dansrow
. La compréhension de la liste externe ([... for row in T1])
) construit une liste des résultats de la compréhension de la liste interne appliquée à chaque élément dansT1
.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 souhaitez traiter des lignes contenant des chaînes 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.
la source
Je préfère utiliser uniquement des listes de compréhension:
la source
Au lieu de mettre
int( )
, mettezfloat( )
qui vous permettra d'utiliser des décimales avec des entiers.la source
Je suis d'accord avec les réponses de tout le monde jusqu'à présent, mais le problème est que si vous n'avez pas tous les nombres entiers, ils planteront.
Si vous vouliez exclure des non-entiers,
Cela ne donne que des chiffres réels. La raison pour laquelle je n'utilise pas de compréhension de liste directe est que la compréhension de liste laisse échapper leurs variables internes.
la source
isdigit
est délicat, essayez-le-1
.int(<str>)
est le moyen de vérifier partry
/except
.la source
Essaye ça.
x est une chaîne car elle est entourée de guillemets, mais elle contient un nombre.
Puisque x contient le numéro 1, je peux le transformer en un entier.
Pour voir si une chaîne est un nombre, vous pouvez le faire.
Il doit imprimer sur IDLE True car x est un nombre.
Il doit imprimer sur IDLE False car y n'est pas un nombre.
la source
x.isnumeric()
.Utilisation de listes de compréhension:
la source
Dans Python 3.5.1, des choses comme celles-ci fonctionnent:
et
George.
la source
Voir cette fonction
alors
Vous pouvez également vérifier
la source
eval
est mauvais: vous devez le remplacer parast.literal_eval
.Encore une autre solution fonctionnelle pour Python 2:
Python 3 sera un peu désordonné cependant:
nous pouvons résoudre ce problème avec un wrapper
la source
Si ce n'est qu'un tuple de tuples, quelque chose comme
rows=[map(int, row) for row in rows]
ça fera l'affaire. (Il y a une compréhension de la liste et un appel à la carte (f, lst), qui est égal à [f (a) pour a in lst], là-dedans.)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 rien d'autre, l'exception int () se lèvera si vous avez une mauvaise entrée).la source
Vous pouvez faire quelque chose comme ça:
la source
Je souhaite partager une option disponible qui ne semble pas encore être mentionnée ici:
Générera une permutation aléatoire du tableau x. Pas exactement ce que vous avez demandé, mais c'est une solution potentielle à des questions similaires.
la source