mia domanda è come quello di eliminare tutte le stringhe da un elenco, per esempio se ho list=['hello',1,2,3,4,'goodbye','help']
e il risultato di essere list=[1,2,3,4]
Come eliminare tutte le stringhe da un elenco
risposta
È 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]
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. :)
è 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]
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
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! –