리스트(list)를 for나 while로 iteration 하는 도중에 특정 아이템을 제거하고자 할때는 아래와 같이 list comprehension 을 사용하면 됩니다.
mylist = [x for x in mylist if check_if_valid(x)]
아래 예제 코드로 확인해 볼께요. 이 예제는, 리스트를 순회하면서 음수들을 제거하는 코드입니다.
# 아이템 x가 0 또는 양수면 True, 음수면 False 반환
def check_if_valid(x):
if x >=0:
return True
return False
mylist = [-1, 2, 10, -100, 0, 5, 7, -3]
mylist = [x for x in mylist if check_if_valid(x)]
print(mylist)
# [2, 10, 0, 5, 7]
위의 방법은 직관적이긴 하지만 한가지 문제가 있습니다. 바로 메모리 이슈입니다. 위의 방법에선 특정 아이템을 필터링하기 위해서 mylist 전체 복사본이 생성되어야 하기 때문입니다. mylist 크기가 작다면 문제 될 것이 없지만 리스트가 메모리에 꽉 찰 정도로 크다면 프로그램이 실행 중에 에러를 내며 종료 될 것입니다.
메모리 문제를 해결하기 위해서는 위의 list comprehension을 generator로 바꿔주어야만 합니다.
gen = (x for x in mylist if check_if_valid(x))
정말로 generator가 맞는지 확인 해볼께요.
import types
isinstance(gen, types.GeneratorType)
# True
이제 mylist에 generator가 생성하는 아이템을 넣어주면 됩니다.
mylist[:] = gen
print(mylist)
# [2, 10, 0, 5, 7]
'파이썬 > 자주하는 질문' 카테고리의 다른 글
파이썬(Python) 8진수 16진수 정수 표현하기 (0) | 2020.09.10 |
---|---|
파이썬(Python) 전역변수 함수에서 접근방법 (0) | 2020.09.10 |
파이썬(Python) 함수 참조에 의한 호출? (0) | 2020.09.10 |
파이썬(Python) 2차원 리스트 합치기 (0) | 2020.09.09 |
파이썬(Python) 리스트 복사하기 (0) | 2020.09.09 |
댓글