루프의 파이썬 목록에서 항목을 제거하는 방법은 무엇입니까?
중복 가능성 :
Python에서 반복하는 동안 목록에서 항목 제거
파이썬의 목록에서 항목을 제거하려고합니다.
x = ["ok", "jj", "uy", "poooo", "fren"]
for item in x:
if len(item) != 2:
print "length of %s is: %s" %(item, len(item))
x.remove(item)
그러나 "fren"
항목을 제거하지는 않습니다 . 어떤 아이디어?
목록을 반복하는 동안 목록에서 항목을 제거 할 수 없습니다. 이전 목록을 기반으로 새 목록을 작성하는 것이 훨씬 쉽습니다.
y = [s for s in x if len(s) == 2]
hymloth와 sven의 답변은 작동하지만 목록을 수정하지 않습니다 (새로 생성). 객체 수정이 필요한 경우 슬라이스에 할당해야합니다.
x[:] = [value for value in x if len(value)==2]
그러나 몇 개의 요소를 제거해야하는 큰 목록의 경우 이는 메모리를 소모하지만 O (n)에서 실행됩니다.
glglgl의 대답 list.remove
은 O (n) 이기 때문에 O (n²) 복잡성으로 고통받습니다 .
데이터 구조에 따라 제거 할 요소의 인덱스에 주목하고 인덱스 del
별로 제거 하려면 키 워크를 사용하는 것이 좋습니다.
to_remove = [i for i, val in enumerate(x) if len(val)==2]
for index in reversed(to_remove): # start at the end to avoid recomputing offsets
del x[index]
del x[i]
인덱스 뒤에 모든 요소를 복사해야하므로 i
(목록은 벡터) 데이터에 대해이를 테스트해야하므로 이제 O (n) 입니다. 그래도 remove
제거 검색 단계 비용을 지불하지 않고 복사 단계 비용이 두 경우 모두 동일하기 때문에 사용하는 것보다 빠릅니다 .
@Sven Marnach의 호의로 제한된 메모리 요구 사항을 가진 매우 멋진 in-place, O (n) 버전 . itertools.compress
파이썬 2.7에서 도입 된 것을 사용합니다 :
from itertools import compress
selectors = (len(s) == 2 for s in x)
for i, s in enumerate(compress(x, selectors)): # enumerate elements of length 2
x[i] = s # move found element to beginning of the list, without resizing
del x[i+1:] # trim the end of the list
x = [i for i in x if len(i)==2]
이는 삭제시 인덱스에 대해서만 작동하므로 반복이 하나의 요소를 건너 뛰기 때문입니다.
해결 방법은 다음과 같습니다.
x = ["ok", "jj", "uy", "poooo", "fren"]
for item in x[:]: # make a copy of x
if len(item) != 2:
print "length of %s is: %s" %(item, len(item))
x.remove(item)
이미 언급 한 목록 이해 방식이 가장 좋은 방법 일 것입니다. 그러나 절대적으로 제자리에서 수행하려는 경우 (예 x
: 크기가 정말 큰 경우) 다음과 같은 한 가지 방법이 있습니다.
x = ["ok", "jj", "uy", "poooo", "fren"]
index=0
while index < len(x):
if len(x[index]) != 2:
print "length of %s is: %s" %(x[index], len(x[index]))
del x[index]
continue
index+=1
참조 URL : https://stackoverflow.com/questions/8312829/how-to-remove-item-from-a-python-list-in-a-loop
'IT TIP' 카테고리의 다른 글
std :: transform () 및 toupper (), 일치하는 함수 없음 (0) | 2020.12.29 |
---|---|
jQuery Deferred-여러 AJAX 요청이 완료되기를 기다리는 중 (0) | 2020.12.28 |
TFS에서 특정 사용자의 체크인 기록을 보는 방법은 무엇입니까? (0) | 2020.12.28 |
Android 기기의 CURRENT 방향 (ActivityInfo.SCREEN_ORIENTATION_ *)은 어떻게 얻습니까? (0) | 2020.12.28 |
UIImagePickerController로 만든 동영상의 파일 크기를 줄이려면 어떻게해야합니까? (0) | 2020.12.28 |