2016-05-03 14 views

risposta

9

È necessario utilizzare isinstance per filtrare gli elementi che sono una stringa. Inoltre, non nominare la variabile list sarà ombra costruito in list

>>> from numbers import Real 
>>> lst = ['hello', 1, 2, 3, 4, 'goodbye', 'help'] 
>>> [element for element in lst if isinstance(element, Real)] 
[1, 2, 3, 4] 

o

>>> [element for element in lst if isinstance(element, int)] 
[1, 2, 3, 4] 

o

>>> [element for element in lst if not isinstance(element, str)] 
[1, 2, 3, 4] 
1

usare sia di lista come @ user3100115 o utilizzare il "Lisp/lambda approach "

>> l = [1, 2, 'a', 'b'] 
>> list(filter(lambda a: isinstance(a, int), l)) 
[1, 2] 

A proposito, non nominare la variabile list. È già una funzione python. :)

+1

Se avete bisogno di un 'lambda' usare' filter', poi un listcomp o genexpr sta andando sempre essere più veloce e altrettanto succinta (assumendo un nome breve per la variabile viene iterata). Per favore non usare 'map' /' filter' se hai bisogno di un 'lambda' per farli funzionare. – ShadowRanger

+0

Ho aggiunto questo approccio "lisp" per completezza perché al momento c'era solo una risposta sulla comprensione delle liste. Non sapevo che fosse più lento. Grazie! –

2

è possibile farlo utilizzando isinstance, ma a differenza degli altri risposta da user3100115 avrei tipi lista nera che non si vuole invece di whitelist solo alcuni tipi. Non sei sicuro di quale sarebbe più adatto per il tuo caso speciale, aggiungendolo solo in alternativa. Funziona anche senza importazioni.

lst = ['hello', 1, 2, 3, 4, 'goodbye', 'help'] 
filtered = [element for element in lst if not isinstance(element, str)] 
print(filtered) 
# [1, 2, 3, 4] 

Invece di una lista di comprensione, si potrebbe anche utilizzare il filter incorporato. Questo restituisce un generatore, quindi per stamparlo direttamente, devi prima convertirlo in una lista. Ma se hai intenzione di iterare su di esso (ad esempio utilizzando un for -loop), non convertirlo e sarà più veloce e consumerà meno memoria a causa di "valutazione lazy". È possibile ottenere lo stesso risultato nell'esempio precedente se si sostituiscono le parentesi quadre con le parentesi tonde.

lst = ['hello', 1, 2, 3, 4, 'goodbye', 'help'] 
filtered = list(filter(lambda element: not isinstance(element, str), lst)) 
print(filtered) 
# [1, 2, 3, 4]