IT TIP

루프의 파이썬 목록에서 항목을 제거하는 방법은 무엇입니까?

itqueen 2020. 12. 28. 22:22
반응형

루프의 파이썬 목록에서 항목을 제거하는 방법은 무엇입니까?


중복 가능성 :
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

반응형