2010-07-30 18 views
126

Ho una lista con le stringhe numeriche, in questo modo:Chiamare la funzione int() su ogni elemento della lista?

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

vorrei convertire ogni elemento della lista a intero, in modo che sarebbe simile a questa:

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

ho potuto farlo utilizzando un ciclo, così:

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

Dev'essere così brutto? Sono sicuro che c'è un modo più plateale di farlo in una sola riga di codice. Per favore aiutatemi.

+1

Quale versione di Python stai usando ? –

+0

Io uso python 2.6, grazie –

risposta

262

Questo è ciò list comprehension sono per:

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

In Python 2.x un altro approccio è quello di utilizzare map:

numbers = map(int, numbers) 

Nota: in Python 3.x map restituisce un oggetto della mappa che puoi convertire in un elenco se lo desideri:

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

In Python 3.x, 'map' restituisce un iteratore invece di una lista, quindi deve essere scritto come' lista (map (int, numbers)) 'se è necessario un elenco. – kennytm

+0

@KennyTM: Grazie. Aggiornato. :) –

+2

Penso che attualmente l'approccio alla comprensione delle liste sia un po 'più favorito. – extraneon

3

Ano modo ther,

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

OP ha detto * pythonic * – SilentGhost

+2

no, ha detto "... più pythonic" –

+3

In questo modo è molto utile se si desidera eseguire l'operazione solo su alcuni elementi nell'elenco. Questo non è rilevante per la domanda in questo thread ma ci possono essere casi in cui è utile – Dikla

8

Se avete intenzione sul passaggio di quei numeri interi a una funzione o un metodo, si consideri questo esempio:

sum(int(x) for x in numbers) 

Questa costruzione è volutamente molto simile a elencare comprehensions citati da adamk. Senza le parentesi quadre, si chiama un'espressione di generatore ed è un modo molto efficiente di memoria per passare un elenco di argomenti a un metodo. Una buona discussione è disponibile qui: Generator Expressions vs. List Comprehension

12

solo un punto,

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

la lista di comprensione è più naturale, mentre

numbers = map(int, x) 

è più veloce.

Probabilmente questo non importa, nella maggior parte dei casi

Leggere utile: LP vs map

+6

Non dovrebbe essere numero = mappa (int, numero)? – Karan

2

Un altro modo per farlo in Python 3:

numbers = [*map(int, numbers)]

+0

Puoi spiegare questo? Non ho familiarità con quella sintassi. Grazie! – abalter

+1

Sto usando l'elenco degli argomenti di decompressione (https://docs.python.org/3/tutorial/controlflow.html#unpacking-argument-lists) –

+0

Aha, una cosa di python 3. Sembra strano avere '[]' prendere una lista di argomenti. E, non sapevo che potresti passare un iteratore come una lista di argomenti. Avrei pensato di fare 'number = list (map (int, numbers))'. Ma grazie per la spiegazione! – abalter

Problemi correlati