2016-05-03 22 views

Odpowiedz

9

Trzeba użyć isinstance odfiltrować te elementy, które są ciągami. Również nie nazwać zmienną list będzie śledzony wbudowanego 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] 

lub

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

lub

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

Albo użycie listowego jako @ user3100115 lub użyć „LISP/metoda lambda "

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

Przy okazji, nie nazwij swojej zmiennej list. Jest to już funkcja python. :)

+1

Jeśli potrzebujesz 'lambda' użyć' filter', potem listcomp lub genexpr zawsze będzie szybciej i równie zwięzły (zakładając krótką nazwę dla zmiennej jest powtórzyć). Proszę nie używać 'map' /' filter', jeśli potrzebujesz 'lambda', aby działał. – ShadowRanger

+0

Dodałem to podejście "lisp" dla kompletności, ponieważ w tamtym czasie była tylko jedna odpowiedź na temat rozumienia list. Nie wiedziałem, że jest wolniej. Dzięki! –

2

Można to zrobić za pomocą isinstance, ale w przeciwieństwie do innych Odpowiedź user3100115 bym czarnej listy typów, które nie chcesz zamiast białej listy tylko kilka typów. Nie jestem pewien, który byłby bardziej odpowiedni dla Twojego szczególnego przypadku, po prostu dodaj to jako alternatywę. Działa również bez żadnego importu.

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] 

zamiast listy zrozumienia, można również użyć filter polecenie wbudowane. To zwraca generator, więc aby go bezpośrednio wydrukować, musisz najpierw przekonwertować go na listę. Ale jeśli zamierzasz go powtórzyć (na przykład przy użyciu pętli for), nie konwertuj go, a będzie on szybszy i zużywa mniej pamięci z powodu "leniwej oceny". Możesz osiągnąć to samo z powyższym przykładem, jeśli zamieniasz nawiasy kwadratowe na nawiasy okrągłe.

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