web-dev-qa-db-fra.com

Appelez la fonction int () sur chaque élément de la liste?

J'ai une liste avec des chaînes numériques, comme ceci:

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

Je voudrais convertir chaque élément de la liste en entier, ainsi cela 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;

Est-ce que ça doit être si moche? Je suis sûr qu'il existe une méthode plus pythonique pour le faire dans une ligne de code. Sil te plait aide moi.

154
Silver Light

Ceci est ce que liste compréhensions sont pour:

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

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

numbers = map(int, numbers)

Remarque: dans Python 3.x map renvoie un objet de carte que vous pouvez convertir en liste si vous le souhaitez:

numbers = list(map(int, numbers))
110
Mark Byers

juste un point,

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

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

numbers = map(int, numbers)

est plus rapide. 

Cela n'aura probablement pas d'importance dans la plupart des cas

Lecture utile: LP vs map

16
renatopp

Si vous souhaitez transmettre ces entiers à une fonction ou à une méthode, tenez compte de cet exemple:

sum(int(x) for x in numbers)

Cette construction est intentionnellement remarquablement similaire aux interprétations de liste mentionnées par adamk. Sans crochets, elle s'appelle une expression generator et constitue un moyen très efficace de passer une liste d'arguments à une méthode. Une bonne discussion est disponible ici: Expressions de générateur contre compréhension de liste

9
Tim McNamara

Autrement,

for i, v in enumerate(numbers): numbers[i] = int(v)
3
Nick Dandoulakis

Je pensais que je regrouperais les réponses et montrerais quelques résultats de timeit.

Python 2 est vraiment nul, mais map est un peu plus rapide que la compréhension.

Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
116.25092001434314
>>> timeit.timeit('map(int, l)', setup)
106.66044823117454

Python 3 est 4 fois plus rapide en lui-même, mais convertir l'objet générateur map en liste est encore plus rapide que la compréhension, et créer cette liste en décompressant le générateur map (merci Artem!) Est encore un peu plus rapide.

Python 3.6.1 (v3.6.1:69c0db5, Mar 21 2017, 17:54:52) [MSC v.1900 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> import timeit
>>> setup = """import random
random.seed(10)
l = [str(random.randint(0, 99)) for i in range(100)]"""
>>> timeit.timeit('[int(v) for v in l]', setup)
25.133059591551955
>>> timeit.timeit('list(map(int, l))', setup)
19.705547827217515
>>> timeit.timeit('[*map(int, l)]', setup)
19.45838406513076

Remarque: En Python 3, 4 éléments semblent être le point de croisement (3 en Python 2) où la compréhension est légèrement plus rapide, bien que la décompression du générateur soit toujours plus rapide que pour les listes comportant plus d'un élément.

0
Jim