나의 목록
L = [0, 23, 234, 89, None, 0, 35, 9]
내가 이것을 실행할 때 :
L = filter(None, L)
이 결과를 얻습니다
[23, 234, 89, 35, 9]
그러나 이것은 내가 필요한 것이 아니며, 실제로 필요한 것은 다음과 같습니다.
[0, 23, 234, 89, 0, 35, 9]
데이터의 백분위 수를 계산하기 때문에 0은 많은 차이를 만듭니다.
0 값을 제거하지 않고 목록에서 없음 값을 제거하는 방법은 무엇입니까?
답변
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9]
재미를 위해을 filter
사용하지 않고이 작업을 수행 할 수있는 방법이 있습니다 lambda
(이 코드는 권장하지 않습니다-단지 과학적인 목적입니다)
>>> from operator import is_not
>>> from functools import partial
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> filter(partial(is_not, None), L)
[0, 23, 234, 89, 0, 35, 9]
답변
FWIW, Python 3는이 문제를 쉽게 만듭니다.
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> list(filter(None.__ne__, L))
[0, 23, 234, 89, 0, 35, 9]
Python 2에서는 대신 목록 이해를 사용합니다.
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9]
답변
목록 이해를 사용하여 다음과 같이 수행 할 수 있습니다.
l = [i for i in my_list if i is not None]
l의 값은 다음과 같습니다.
[0, 23, 234, 89, 0, 35, 9]
답변
Python 2.7의 경우 (Python 3에 해당하는 Raymond의 답변 참조) :
“없음”이 아닌 것이 파이썬 (및 다른 OO 언어)에서 매우 일반적인지 알고 싶다면 Common.py ( “from from import *”를 사용하여 각 모듈로 가져옴)에서 다음 줄을 포함합니다.
def exists(it):
return (it is not None)
그런 다음 목록에서 없음 요소를 제거하려면 다음을 수행하십시오.
filter(exists, L)
해당 목록 이해력 (레이몬드가 Python 2 버전으로 표시)보다 읽기가 더 쉽다는 것을 알았습니다.
답변
@ jamylak 답변은 매우 훌륭하지만이 간단한 작업을 수행하기 위해 몇 개의 모듈을 가져 오지 않으려면 자체 작성하십시오 lambda
.
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> filter(lambda v: v is not None, L)
[0, 23, 234, 89, 0, 35, 9]
답변
반복 대 공간 , 사용량이 문제가 될 수 있습니다. 다른 상황에서 프로파일 링은 “빠른”및 / 또는 “메모리 부족”집중적 인 것으로 나타날 수 있습니다.
# first
>>> L = [0, 23, 234, 89, None, 0, 35, 9, ...]
>>> [x for x in L if x is not None]
[0, 23, 234, 89, 0, 35, 9, ...]
# second
>>> L = [0, 23, 234, 89, None, 0, 35, 9]
>>> for i in range(L.count(None)): L.remove(None)
[0, 23, 234, 89, 0, 35, 9, ...]
첫 번째 접근법 ( @jamylak , @Raymond Hettinger 및 @Dipto에 의해 제안 됨 )은 메모리에 중복 목록을 생성합니다.None
항목을.
두 번째 접근 방식은 목록을 한 번 통과 한 다음 a None
에 도달 할 때까지 다시 반복합니다 . 메모리 사용량이 적을 수 있으며 목록이 작을수록 작아집니다. 목록 크기가 줄어들 None
면 전면에있는 많은 항목 의 속도가 빨라질 수 있지만, 많은 None
항목이 후면에 있는 경우 최악의 경우입니다 .
병렬화 및 인플레 이스 기술은 다른 접근 방식이지만 각각 Python에서 자체적 인 문제가 있습니다. 데이터 및 런타임 유스 케이스를 알고 프로그램을 프로파일 링하는 작업은 집중적 인 조작 또는 대규모 데이터를 시작하는 곳입니다.
두 가지 방법 중 하나를 선택하면 일반적인 상황에서는 중요하지 않습니다. 표기법이 더 선호됩니다. 사실, 그러한 드문 상황에서, numpy
또는 cython
파이썬 최적화를 미세 관리하려고 시도하는 대신 가치있는 대안이 될 수 있습니다.
답변
from operator import is_not
from functools import partial
filter_null = partial(filter, partial(is_not, None))
# A test case
L = [1, None, 2, None, 3]
L = list(filter_null(L))