1) 거의 영어 스타일 :
in
연산자를 사용하여 존재 여부를 테스트 한 다음 remove
방법 을 적용하십시오 .
if thing in some_list: some_list.remove(thing)
이 remove
방법은 대신 thing
사용할 수있는 모든 항목을 제거하기 위해 첫 번째 항목 만 제거합니다 .while
if
while thing in some_list: some_list.remove(thing)
- 충분히 간단하고 아마도 내 선택. 작은 목록 (한 줄짜리 저항 할 수 없음)
이 첫 번째 질문은 마지막 태도는 파이썬에서 일반적입니다. 물체가 적합한 지 미리 테스트하는 대신 작업을 수행하고 관련 예외를 포착하십시오.
try:
some_list.remove(thing)
except ValueError:
pass # or scream: thing not in some_list!
except AttributeError:
call_security("some_list not quacking like a list!")
물론 위의 예에서 두 번째 예외 조항은 의심스러운 유머뿐만 아니라 완전히 불필요합니다 (요점은 개념에 익숙하지 않은 사람들에게 오리 타이핑을 설명하는 것이 었습니다).
여러 번 나타날 것으로 예상되는 경우 :
while True:
try:
some_list.remove(thing)
except ValueError:
break
- 이 특정 사용 사례에 대해서는 조금 장황하지만 파이썬에서는 매우 관용적입니다.
- 이것은 # 1보다 잘 수행됩니다.
- PEP 463 은 여기서는 편리한 간단한 사용법을 제외하고 시도하기위한 더 짧은 구문을 제안했지만 승인되지 않았습니다.
그러나 contextlib의 suppress () contextmanager (파이썬 3.4에서 도입)를 사용하면 위 코드를 다음과 같이 단순화 할 수 있습니다.
with suppress(ValueError, AttributeError):
some_list.remove(thing)
다시 말하지만 여러 번 나타날 것으로 예상되는 경우 :
with suppress(ValueError):
while True:
some_list.remove(thing)
3) 기능적 스타일 :
약 1993 파이썬 가지고 lambda
, reduce()
, filter()
와 map()
하는 의례 리스프 를 놓친 해커 및 제출 작업 패치 *. filter
목록에서 요소를 제거 하는 데 사용할 수 있습니다 .
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
빈 항목 (여기서 0, 빈 문자열 또는 다른 빈 컬렉션 bool(item) == False
과 같은 항목)을 필터링하려는 경우 None
첫 번째 인수로 없음을 전달할 수 있습니다.
cleaned_list = filter(None, some_list)
- [update] : Python 2.x에서는 이전
filter(function, iterable)
과 같 [item for item in iterable if function(item)]
거나 [item for item in iterable if item]
첫 번째 인수가이면 None
; Python 3.x에서는 이제와 같습니다 (item for item in iterable if function(item))
. 미묘한 차이점은 필터가 목록을 반환하는 데 사용된다는 것입니다. 이제는 생성기 표현식처럼 작동합니다. 정리 된 목록을 반복하고 삭제하는 경우에만 괜찮지 만 목록이 실제로 필요한 경우 filter()
호출 을 묶어야합니다. list()
생성자 와 함께 .
- *이 Lispy 맛 구조는 Python에서 약간 외계인으로 간주됩니다. 2005 년쯤 귀도는 낙하에 대해 이야기하고있었습니다.
filter
동료들 map
과 함께 하고 있었고 reduce
(아직 사라지지 않았지만 functools 모듈 reduce
로 옮겨졌습니다 .이 기능은 고차 함수 를 좋아한다면 볼만한 가치가 있습니다 ).
4) 수학적 스타일 :
목록 이해 는 PEP 202에 의해 버전 2.0에서 도입 된 이후 파이썬에서리스트 조작에 선호되는 스타일이되었습니다 . 그 뒤에 근거는 목록 함축 어디 상황에서 목록을 만들 수있는 더 간결한 방식으로 제공하는 것입니다 map()
및 filter()
및 / 또는 중첩 루프가 현재 사용되는 것입니다.
cleaned_list = [ x for x in some_list if x is not thing ]
제네레이터 표현식은 버전 2.4에서 PEP 289는 . 생성자 표현식은 한 번에 하나씩 요소를 반복하려는 경우와 같이 메모리에 전체 목록을 만들 필요가 없거나 원하지 않는 상황에 더 좋습니다. 목록을 반복하는 경우 생성기 표현식을 지연된 평가 된 목록 이해 로 생각할 수 있습니다 .
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
노트
- 부등식 연산자를 사용할 수 있습니다
!=
대신is not
( 차이가 중요합니다 ).
- 리스트 카피를 암시하는 방법에 대한 비평가들 : 대중적 신념과는 달리, 생성기 표현이리스트 이해보다 항상 효율적인 것은 아닙니다. 불평하기 전에 프로파일 링하십시오