복붙노트

[PYTHON] 한 목록의 모든 값을 다른 목록에서 제거 하시겠습니까? [복제]

PYTHON

한 목록의 모든 값을 다른 목록에서 제거 하시겠습니까? [복제]

다른 목록에서 목록 내의 모든 값을 제거하는 방법을 찾고 있습니다.

이 같은:

a = range(1,10)  
a.remove([2,3,7])  
print a  
a = [1,4,5,6,8,9]  

해결법

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

    1.

    >>> a = range(1, 10)
    >>> [x for x in a if x not in [2, 3, 7]]
    [1, 4, 5, 6, 8, 9]
    
  2. ==============================

    2.반복되는 값이 없으면 set difference를 사용할 수 있습니다.

    반복되는 값이 없으면 set difference를 사용할 수 있습니다.

    x = set(range(10))
    y = x - set([2, 3, 7])
    # y = set([0, 1, 4, 5, 6, 8, 9])
    

    필요한 경우 다시 목록으로 변환하십시오.

  3. ==============================

    3.주제를 빨리 수행 할 방법을 찾고 있었기 때문에 제안 된 방법으로 몇 가지 실험을했습니다. 그리고 나는 결과에 놀랐다. 그래서 나는 당신과 그것을 나누고 싶다.

    주제를 빨리 수행 할 방법을 찾고 있었기 때문에 제안 된 방법으로 몇 가지 실험을했습니다. 그리고 나는 결과에 놀랐다. 그래서 나는 당신과 그것을 나누고 싶다.

    실험은 pythonbenchmark 도구를 사용하여 수행되었습니다.

    a = range(1,50000) # Source list
    b = range(1,15000) # Items to remove
    

    결과 :

     def comprehension(a, b):
         return [x for x in a if x not in b]
    

    5 회 시도, 평균 시간 12.8 초

    def filter_function(a, b):
        return filter(lambda x: x not in b, a)
    

    5 회 시도, 평균 시간 12.6 초

    def modification(a,b):
        for x in b:
            try:
                a.remove(x)
            except ValueError:
                pass
        return a
    

    5 회 시도, 평균 시간 0.27 초

    def set_approach(a,b):
        return list(set(a)-set(b))
    

    5 회 시도, 평균 시간 0.0057 초

    또한 마지막 두 함수에 대해 더 큰 입력 크기를 가진 또 다른 측정을했습니다.

    a = range(1,500000)
    b = range(1,100000)
    

    결과 :

    수정 (제거 방법) - 평균 시간은 252 초입니다. 설정 접근법 - 평균 시간은 0.75 초입니다.

    따라서 세트를 사용한 접근 방식이 다른 방식보다 훨씬 빠르다는 것을 알 수 있습니다. 예, 비슷한 항목을 유지하지 않지만 필요하지 않은 경우 - 그것은 당신을위한 것입니다. 목록 이해와 필터 기능 사용 간에는 거의 차이가 없습니다. '제거'사용은 50 배 빠르지 만 소스 목록을 수정합니다. 그리고 가장 좋은 선택은 세트를 사용하는 것입니다. 이것은 목록 이해보다 1000 배 이상 빠릅니다!

  4. ==============================

    4.

    a = range(1,10)
    itemsToRemove = set([2, 3, 7])
    b = filter(lambda x: x not in itemsToRemove, a)
    

    또는

    b = [x for x in a if x not in itemsToRemove]
    

    람다 안에서 또는 이해력 안에서 세트를 만들지 마십시오. 그렇게하면 모든 반복마다 다시 작성되어 세트를 사용하지 않을 수 있습니다.

  5. ==============================

    5.다른 사람들은 필터링 후 새 목록을 만드는 방법을 제안했습니다.

    다른 사람들은 필터링 후 새 목록을 만드는 방법을 제안했습니다.

    newl = [x for x in l if x not in [2,3,7]]
    

    또는

    newl = filter(lambda x: x not in [2,3,7], l) 
    

    그러나 당신의 질문에서 그것은 당신이 이것을 할 수있는 곳 수정을 원한다고 생각합니다. 원래의 목록이 길고 제거해야 할 항목이 적다면 훨씬 더 빠를 것입니다.

    l = range(1,10)
    for o in set([2,3,7,11]):
        try:
            l.remove(o)
        except ValueError:
            pass
    
    print l
    

    산출:     [1, 4, 5, 6, 8, 9]

    항목이 원래 목록에없는 경우에도 작동하도록 ValueError 예외를 확인하고 있습니다.

    또한 S.Mark의 내부 수정 솔루션이 필요하지 않은 경우 더 간단합니다.

  6. ==============================

    6.가장 간단한 방법은

    가장 간단한 방법은

    >>> a = range(1, 10)
    >>> for x in [2, 3, 7]:
    ...  a.remove(x)
    ... 
    >>> a
    [1, 4, 5, 6, 8, 9]
    

    여기서 한 가지 가능한 문제는 remove ()를 호출 할 때마다 모든 항목이 목록을 따라 섞여 구멍을 채우는 것입니다. 그래서 만약에 아주 커지면 이것은 아주 천천히 끝날 것입니다.

    이 방법은 새로운 목록을 만듭니다. 이점은 우리가 첫 번째 접근법의 모든 뒤섞임을 피할 수 있다는 것입니다.

    >>> removeset = set([2, 3, 7])
    >>> a = [x for x in a if x not in removeset]
    

    제자리에서 수정하려면 작은 변경이 하나만 필요합니다.

    >>> removeset = set([2, 3, 7])
    >>> a[:] = [x for x in a if x not in removeset]
    
  7. ==============================

    7.

    >>> a=range(1,10)
    >>> for i in [2,3,7]: a.remove(i)
    ...
    >>> a
    [1, 4, 5, 6, 8, 9]
    
    >>> a=range(1,10)
    >>> b=map(a.remove,[2,3,7])
    >>> a
    [1, 4, 5, 6, 8, 9]
    
  8. from https://stackoverflow.com/questions/2514961/remove-all-values-within-one-list-from-another-list by cc-by-sa and MIT license