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.
Ceci est ce que liste compréhensions sont pour:
numbers = [ int(x) for x in numbers ]
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
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
Autrement,
for i, v in enumerate(numbers): numbers[i] = int(v)
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.