461 votes

Comment convertir des chaînes de caractères en nombres entiers ?

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 décent.

2 votes

Peut-être envisager un module d'adaptation de base de données différent ? Je sais que les modules d'adaptation PostgreSQL renverront des résultats comme votre ensemble T2.

3 votes

0 votes

Veuillez noter que lorsque vous utilisez map, vous obtiendrez une liste d'objets map dans Python 3 et 3.5. Ceci le fait pour Python 3.5 comme mentionné ci-dessus. new_list = list(list(int(a) for a in b) for b in T1 if a.isdigit())

654voto

unwind Points 181987

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 renvoie le nombre converti en un entier :

>>> int("1") + 1
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 3 :

T2 = [list(map(int, x)) for x in T1]

Dans Python 2 :

T2 = [map(int, x) for x in T1]

4 votes

Pourquoi pas T2 = map(lambda lol: map(int, lol), T1) ? Soit les compréhensions de cartes ou de listes, les deux sont stupides ;)

7 votes

@flyingsheep La double carte me semble idiote, celle-ci me semble très bien.

0 votes

Pourquoi ne pas supprimer l'exemple de Python 2 (en raison de la fin de vie de Python 2) ?

29voto

Will Harris Points 17002

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 la liste intérieure ( [int(column) for column in row] ) construit un list de int à partir d'une séquence de int -comme les chaînes de caractères décimales, dans la section row . La compréhension de la liste extérieure ( [... for row in T1]) ) construit une liste des résultats de la compréhension de la liste interne appliquée à chaque élément de la liste. T1 .

Le code échouera si l'une des lignes contient des objets qui ne peuvent pas être convertis par la fonction int . Vous aurez besoin d'une fonction plus intelligente si vous voulez 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]

21voto

odwl Points 638

Je préférerais utiliser uniquement des listes de compréhension :

[[int(y) for y in x] for x in T1]

9voto

Christian Witts Points 4369

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 vont se planter.

Si vous vouliez exclure les 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 des chiffres réels. La raison pour laquelle je n'utilise pas les compréhensions de listes directes est que les compréhensions de listes laissent échapper leurs variables internes.

2 votes

isdigit est délicat, essayez-le sur -1 . int(<str>) est le moyen de vérifier par try / except .

8voto

P.Hunter Points 41
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

8 votes

Bienvenue à Stack Overflow ! Plutôt que de poster uniquement un bloc de code, veuillez expliquer pourquoi ce code résout le problème posé. Sans explication, il ne s'agit pas d'une réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X