IT story

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

hot-time 2020. 8. 5. 07:46
반응형

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


이 질문에는 이미 답변이 있습니다.

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

이 같은:

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

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

반복되는 값이 없으면 차이 설정을 사용할 수 있습니다.

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

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


나는 주제를 수행하는 빠른 방법을 찾고 있었으므로 제안 된 방법으로 실험을했습니다. 결과에 놀랐습니다. 공유하고 싶습니다.

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 배 이상 빠릅니다!


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]

내부 lambda또는 내부에서 세트를 작성하지 마십시오 . 그렇게하면, 반복 할 때마다 다시 생성되어 세트를 사용하는 시점을 무너 뜨릴 것입니다.


가장 간단한 방법은

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

여기서 가능한 문제는 remove ()를 호출 할 때마다 모든 항목이 목록을 따라 섞여서 구멍을 채 웁니다. 따라서 a매우 커지면 결국 느려질 것입니다.

이렇게하면 새로운 목록이 만들어집니다. 장점은 첫 번째 접근 방식의 모든 셔플 링을 피한다는 것입니다

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

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

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

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

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

또는

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

but from your question it looks you want in-place modification for that you can do this, this will also be much much faster if original list is long and items to be removed less

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

print l

output: [1, 4, 5, 6, 8, 9]

I am checking for ValueError exception so it works even if items are not in orginal list.

Also if you do not need in-place modification solution by S.Mark is simpler.


>>> 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]

참고URL : https://stackoverflow.com/questions/2514961/remove-all-values-within-one-list-from-another-list

반응형