2010-07-30 5 views
126

J'ai une liste avec des chaînes numériques, comme ceci:Appelez la fonction int() sur chaque élément de la liste?

numbers = ['1', '5', '10', '8']; 

Je voudrais convertir tous les éléments de la liste en entier, il ressemblerait à ceci:

numbers = [1, 5, 10, 8]; 

je pourrais le faire en utilisant une boucle, comme ceci:

new_numbers = []; 
for n in numbers: 
    new_numbers.append(int(n)); 
numbers = new_numbers; 

Faut-il être si moche? Je suis sûr qu'il y a une façon plus pythonique de le faire dans une ligne de code. Sil te plait aide moi.

+1

Quelle version de Python utilisez-vous ? –

+0

J'utilise python 2.6, merci –

Répondre

262

C'est ce que compréhensions de liste sont pour:

numbers = [ int(x) for x in numbers ] 
89

En Python 2.x une autre approche consiste à utiliser map:

numbers = map(int, numbers) 

Note: en Python 3.x map retourne un objet carte que vous pouvez convertir en une liste si vous le souhaitez:

numbers = list(map(int, numbers)) 
+8

Dans Python 3.x, 'map' renvoie un itérateur au lieu d'une liste, il doit donc être écrit comme' list (map (int, numbers)) 'si une liste est nécessaire. – kennytm

+0

@KennyTM: Merci. Actualisé. :) –

+2

Je pense que l'approche de la compréhension de liste est actuellement un peu plus favorisée. – extraneon

3

Ano manière ther,

for i, v in enumerate(numbers): numbers[i] = int(v) 
+5

OP dit * pythonic * – SilentGhost

+2

non, il a dit "... plus pythonique" –

+3

De cette façon est très utile si vous souhaitez exécuter l'opération seulement sur certains des éléments de la liste. Ce n'est pas pertinent pour la question dans ce fil, mais il peut y avoir des cas où c'est utile – Dikla

8

Si vous avez l'intention de passer les entiers à une fonction ou méthode, tenez compte cet exemple:

sum(int(x) for x in numbers) 

Cette construction est volontairement remarquablement similaire à la liste compréhensions mentionnés par adamk. Sans les crochets, on parle d'une expression de générateur , et c'est un moyen très efficace en mémoire de transmettre une liste d'arguments à une méthode. Une bonne discussion est disponible ici: Generator Expressions vs. List Comprehension

12

juste un point,

numbers = [int(x) for x in numbers] 

la compréhension de la liste est plus naturel, alors que

numbers = map(int, x) 

est plus rapide.

Probablement ce ne sera pas question dans la plupart des cas

lecture utile: LP vs map

+6

Ne devrait-il pas être number = map (int, number)? – Karan

2

Une autre façon de le faire en Python 3:

numbers = [*map(int, numbers)]

+0

Pouvez-vous expliquer cela? Je ne suis pas familier avec cette syntaxe. Merci! – abalter

+1

J'utilise la liste des arguments de déballage (https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists) –

+0

Aha, une chose python 3. Il semble étrange d'avoir '[]' prendre une liste d'arguments. Et, je ne savais pas que vous pouviez passer un itérateur comme liste d'arguments. J'aurais pensé faire 'number = list (map (int, numbers))'. Mais merci pour l'explication! – abalter

Questions connexes