J'ai un tuple de tuples à partir d'une requête MySQL comme celle-ci:
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
J'aimerais convertir tous les éléments de chaîne en entiers et les replacer 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 avec eval
mais je n'ai pas encore obtenu de résultat décent.
int()
est la fonction intégrée standard de Python permettant de convertir une chaîne en valeur entière. Vous l'appelez avec une chaîne contenant un nombre comme argument et renvoie le nombre converti en entier:
print (int("1") + 1)
Ce qui précède imprime 2
.
Si vous connaissez la structure de votre liste, T1 (qu'elle contient simplement des listes, un seul niveau), vous pouvez le faire dans 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 list
de int
s à partir d'une séquence d'objets int
-, comme des chaînes décimales, dans row
. 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 dans 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 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.
T2 = [parse_a_row_of_T1(row) for row in T1]
Je préférerais utiliser uniquement des listes de compréhension:
[[int(y) for y in x] for x in T1]
Au lieu de mettre int( )
, mettez float( )
qui vous permettra d'utiliser des décimales avec des entiers.
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 entiers, ils planteront.
Si vous vouliez exclure des non-entiers alors
T1 = (('13', '17', '18', '21', '32'),
('07', '11', '13', '14', '28'),
('01', '05', '06', '08', '15', '16'))
new_list = list(list(int(a) for a in b) for b in T1 if a.isdigit())
Cela ne donne que les chiffres réels. La raison pour laquelle je n'utilise pas les compréhensions directes de liste est parce que la compréhension de liste fuit leurs variables internes.
T3=[]
for i in range(0,len(T1)):
T3.append([])
for j in range(0,len(T1[i])):
b=int(T1[i][j])
T3[i].append(b)
print T3
Essaye ça.
x = "1"
x est une chaîne car il y a des guillemets, mais il y a un nombre.
x = int(x)
Puisque x contient le nombre 1, je peux le transformer en entier.
Pour voir si une chaîne est un nombre, vous pouvez le faire.
def is_number(var):
try:
if var == int(var):
return True
except Exception:
return False
x = "1"
y = "test"
x_test = is_number(x)
print(x_test)
Il devrait imprimer sur IDLE True car x est un nombre.
y_test = is_number(y)
print(y_test)
Il devrait imprimer sur IDLE Faux car y n'est pas un nombre.
Utilisation de la compréhension de liste:
t2 = [map(int, list(l)) for l in t1]
Dans Python 3.5.1, des choses comme celles-ci fonctionnent:
c = input('Enter number:')
print (int(float(c)))
print (round(float(c)))
et
Enter number: 4.7
4
5
George.
Voir cette fonction
def parse_int(s):
try:
res = int(eval(str(s)))
if type(res) == int:
return res
except:
return
Ensuite
val = parse_int('10') # Return 10
val = parse_int('0') # Return 0
val = parse_int('10.5') # Return 10
val = parse_int('0.0') # Return 0
val = parse_int('Ten') # Return None
Vous pouvez aussi vérifier
if val == None: # True if input value can not be converted
pass # Note: Don't use 'if not val:'
Encore une autre solution fonctionnelle pour Python 2:
from functools import partial
map(partial(map, int), T1)
Python 3 sera un peu en désordre cependant:
list(map(list, map(partial(map, int), T1)))
nous pouvons résoudre ce problème avec un wrapper
def oldmap(f, iterable):
return list(map(f, iterable))
oldmap(partial(oldmap, int), T1)
Si ce n'est qu'un tuple de n-uplets, quelque chose comme rows=[map(int, row) for row in rows]
fera l'affaire. (Il y a une compréhension de la liste et un appel à map (f, lst), qui est égal à [f (a) pour a dans lst], ici.)
Eval 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 contribution).
Je souhaite partager une option disponible qui ne semble pas encore être mentionnée ici:
rumpy.random.permutation(x)
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.