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)
'IT story' 카테고리의 다른 글
클래스가 주어지면 인스턴스에 메소드가 있는지 확인하십시오 (Ruby) (0) | 2020.04.25 |
---|---|
ng-class를 사용하는 AngularJS 토글 클래스 (0) | 2020.04.25 |
노드에서 es6 가져 오기를 어떻게 사용합니까? (0) | 2020.04.25 |
LIKE 절에서 대괄호를 어떻게 피할 수 있습니까? (0) | 2020.04.25 |
tmux 모드에서 vim colorscheme을 잃으십시오 (0) | 2020.04.25 |