복붙노트

[PYTHON] 어떻게 루프에서 파이썬 목록에서 항목을 제거하려면? [복제]

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"항목은 제거되지 않습니다. 어떤 아이디어?

해결법

  1. ==============================

    1.목록을 반복하는 동안 목록에서 항목을 제거 할 수 없습니다. 이전 목록을 기반으로 새 목록을 만드는 것이 훨씬 쉽습니다.

    목록을 반복하는 동안 목록에서 항목을 제거 할 수 없습니다. 이전 목록을 기반으로 새 목록을 만드는 것이 훨씬 쉽습니다.

    y = [s for s in x if len(s) == 2]
    
  2. ==============================

    2.hymloth와 sven의 답변은 작동하지만 목록을 수정하지 않습니다 (새 것을 작성하십시오). 개체 수정이 필요한 경우 슬라이스에 할당해야합니다.

    hymloth와 sven의 답변은 작동하지만 목록을 수정하지 않습니다 (새 것을 작성하십시오). 개체 수정이 필요한 경우 슬라이스에 할당해야합니다.

    x[:] = [value for value in x if len(value)==2]
    

    그러나 몇 가지 요소를 제거해야하는 큰 목록의 경우 메모리가 많이 소모되지만 O (n)에서 실행됩니다.

    glglgl의 대답은 list.remove가 O (n)이기 때문에 O (n²)의 복잡성으로 인해 어려움을 겪습니다.

    데이터의 구조에 따라, 색인을 제거하기 위해 del keywork를 제거하고 사용하는 요소의 색인을 선호하는 것이 좋습니다.

    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]도 O (n)입니다. 왜냐하면 색인 i 다음에 모든 요소를 ​​복사해야하므로 (목록은 벡터 임), 데이터에 대해이를 테스트해야합니다. 여전히 remove를 사용하는 것보다 빨라야합니다. 왜냐하면 remove의 검색 단계 비용을 지불하지 않기 때문에 복사 단계 비용이 두 경우 모두 동일하기 때문입니다.

    제한된 메모리 요구 사항을 가진 O (n) 버전, @Sven Marnach의 호의로 아주 좋은 장소에서. 그것은 python 2.7에서 소개 된 itertools.compress를 사용합니다 :

    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
    
  3. ==============================

    3.

    x = [i for i in x if len(i)==2]
    
  4. ==============================

    4.이는 삭제시 반복이 하나의 요소를 건너 뛴다는 사실에서 유래합니다. 즉 인덱스에서만 작업하기 때문입니다.

    이는 삭제시 반복이 하나의 요소를 건너 뛴다는 사실에서 유래합니다. 즉 인덱스에서만 작업하기 때문입니다.

    해결 방법은 다음과 같습니다.

    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)
    
  5. ==============================

    5.앞서 언급 한 목록 이해 방법이 아마도 최선의 방법 일 것입니다. 그러나 만약 당신이 절대적으로 그것을 (예를 들어, x가 정말로 큰 경우) 여기에서하고 싶다면, 여기에 한가지 방법이 있습니다 :

    앞서 언급 한 목록 이해 방법이 아마도 최선의 방법 일 것입니다. 그러나 만약 당신이 절대적으로 그것을 (예를 들어, 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
    
  6. from https://stackoverflow.com/questions/8312829/how-to-remove-item-from-a-python-list-in-a-loop by cc-by-sa and MIT license