moje pytanie brzmi: w jaki sposób, aby wyeliminować wszystkie ciągi z listy, na przykład jeśli mam list=['hello',1,2,3,4,'goodbye','help']
a wynik będzie list=[1,2,3,4]
Jak wyeliminować wszystkie ciągi z listy
Odpowiedz
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]
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. :)
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]
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
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! –