2009-03-13 7 views
317

J'ai un tuple de tuples d'une requête MySQL comme ceci:Comment convertir des chaînes en entiers en Python?

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 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 l'atteindre avec eval mais je n'ai pas encore obtenu de résultat décent.

+2

considèrent peut-être un module adaptateur de base de données différente?Je sais que les modules de l'adaptateur PostgreSQL retourneront des résultats comme votre ensemble T2. – kquinn

+3

Copie possible de [Parse String to Float ou Int] (http://stackoverflow.com/questions/379906/parse-string-to-float-or-int) – Nathan

+0

Notez s'il vous plaît: lorsque vous utilisez la carte, vous obtiendrez une liste des objets cartographiques en python 3 et 3.5. Cela le fait pour Python 3.5 comme mentionné ci-dessus. new_list = list (list (int (a) pour a dans b) pour b dans T1 si a.isdigit()) – Guest

Répondre

476

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

print int("1") + 1 

Les impressions ci-dessus 2.

Si vous connaissez la structure de votre liste, T1 (qu'il contient simplement des listes, un seul niveau), vous pouvez le faire en Python 2:

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

En Python 3:

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

Great! En fait, l'exemple donné fonctionne aussi pour les nombres "nus" dans l'entrée, mais les enrobera dans des listes à un élément. – unwind

+1

@unwind Belle réponse – aatifh

+1

ne fonctionne pas dans py3k – SilentGhost

26

Vous pouvez le faire avec une compréhension de la 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]) b Utilise un list de int s à partir d'une séquence de int -objets, comme des chaînes décimales, en row. La compréhension de la liste externe ([... for row in T1])) génère une liste des résultats de la compréhension de 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 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 liste interne par un appel à une fonction de la ligne. Par exemple.

T2 = [parse_a_row_of_T1(row) for row in T1] 
0

Si c'est seulement un tuple de tuples, quelque chose comme rows=[map(int, row) for row in rows] fera l'affaire. (Il y a une compréhension de liste et un appel à la carte (f, LST), qui est égale à [f (a) pour en LST], là-dedans.)

Eval est pas ce que vous voulez faire, Dans le cas où il y a quelque chose comme __import__("os").unlink("importantsystemfile") dans votre base de données pour une raison quelconque. Toujours valider votre entrée (si rien d'autre, l'exception int() va augmenter si vous avez une mauvaise entrée).

4

Utilisation liste compréhensions:

t2 = [map(int, list(l)) for l in t1] 
+0

dans python 3 cela renvoie une liste d'objets de la carte :( – CpILL

10

Je suis d'accord avec les réponses à ce jour everyones mais le problème est que si vous ne ils heurtez pas avoir tous les entiers.

Si vous voulez exclure les non-entiers puis

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()) 

Ce ne donne que les chiffres réels. La raison pour laquelle je n'utilise pas la compréhension directe des listes est que la compréhension de la liste fuit leurs variables internes.

+1

'isdigit' est difficile, essayez-le sur' -1'. 'Int ()' est le moyen de vérifier par 'try' /' except' – totoro

14

Je préfère préfèrent utiliser uniquement des listes de compréhension:

[[int(y) for y in x] for x in T1] 
9
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 
+6

Bienvenue Stack Overflow! Plutôt que de poster seulement un bloc de code, s'il vous plaît expliquer pourquoi ce code résout le problème posé.Sans explication, ce n'est pas une meilleure réponse serait: – Artemix

+1

Mieux serait: –

10

Au lieu de mettre int(), mis float() qui vous permettra d'utiliser décimaux avec des entiers.

+1

Pouvez-vous expliquer plus de détails sur votre réponse? – Rico

6

Essayez ceci.

x = "1" 

x est une chaîne car elle est entourée de guillemets, mais contient un nombre.

x = int(x) 

Puisque x a le numéro 1, je peux le transformer en nombre 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 doit imprimer sur IDLE True car x est un nombre.

y_test = is_number(y) 

print(y_test) 

Il faut imprimer IDLE Faux parce que y en pas un numéro.

+2

Votre fonction is_number est erronée. '1' n'est pas égal à 1. Ceci n'est pas Perl. :-P – Veky

+0

Ne pas réinventer la roue, utilisez 'x.isnumeric()'. – bfontaine

3

En Python 3.5.1 choses comme ces travaux:

c = input('Enter number:') 
print (int(float(c))) 
print (round(float(c))) 

et

Enter number: 4.7 
4 
5 

George.

-6
for str in T2 : 
    return num(str) 

peut-être que, travaillerons

+3

Veuillez tester votre code avant de poster –

2

Une autre solution fonctionnelle pour Python 2:

from functools import partial 

map(partial(map, int), T1) 

Python 3 sera un peu en désordre si:

list(map(list, map(partial(map, int), T1))) 

nous pouvons réparer ceci avec un wrapper

def oldmap(f, iterable): 
    return list(map(f, iterable)) 

oldmap(partial(oldmap, int), T1) 
0

Voir cette fonction

def parse_int(s): 
    try: 
     res = int(eval(str(s))) 
     if type(res) == int: 
      return res 
    except: 
     return 

Puis

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 également consulter

if val == None: # True if input value can not be converted 
    pass # Note: Don't use 'if not val:' 
Questions connexes