[python] 0 값을 제거하지 않고 목록에서 None 값을 제거

이것이 내가 시작한 나의 근원이었습니다.

나의 목록

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))