IT story

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

hot-time 2020. 4. 25. 09:56
반응형

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]

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 버전으로 표시)보다 읽기가 더 쉽다는 것을 알았습니다.


리스트 이해를 사용하여 다음과 같이 수행 할 수 있습니다.

l = [i for i in my_list if i is not None]

l의 값은 다음과 같습니다.

[0, 23, 234, 89, 0, 35, 9]

@ 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항목이 후면에 있는 경우 최악의 경우입니다 .

병렬화 및 인플레 이스 기술은 다른 접근 방식이지만 각각 파이썬에서 고유 한 문제가 있습니다. 데이터 및 런타임 유스 케이스를 알고 프로그램을 프로파일 링하는 작업은 집중적 인 조작 또는 대규모 데이터를 시작하는 곳입니다.

두 가지 방법 중 하나를 선택하면 일반적인 상황에서는 중요하지 않습니다. 표기법이 더 선호됩니다. 사실, 그러한 드문 상황에서, 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))

모두 목록의 목록 인 경우 @Raymond의 답변을 수정할 수 있습니다

L = [ [None], [123], [None], [151] ] no_none_val = list(filter(None.__ne__, [x[0] for x in L] ) ) 그러나 파이썬 2의 경우

no_none_val = [x[0] for x in L if x[0] is not None] """ Both returns [123, 151]"""

<< 변수가 None이 아닌 경우 List의 변수에 대한 list_indice [0] >>


목록이 아래와 같다고 말하십시오.

iterator = [None, 1, 2, 0, '', None, False, {}, (), []]

이것은 bool(item) is True

print filter(lambda item: item, iterator)
# [1, 2]

이것은

print [item for item in iterator if item]

없음 만 필터링하려면 :

print filter(lambda item: item is not None, iterator)
# [1, 2, 0, '', False, {}, (), []]

다음과 같습니다.

print [item for item in iterator if item is not None]

False로 평가되는 모든 항목을 가져 오려면

print filter(lambda item: not item, iterator)
# Will print [None, '', 0, None, False, {}, (), []]

이 솔루션은 다음이 아닌 동안 사용 합니다 .

value = None
while value in yourlist:
    yourlist.remove(value)

참고 URL : https://stackoverflow.com/questions/16096754/remove-none-value-from-a-list-without-removing-the-0-value

반응형