한 목록의 모든 값을 다른 목록에서 제거 하시겠습니까? [복제]
이 질문에는 이미 답변이 있습니다.
- 한 목록에서 발생하는 모든 요소를 다른 6 개의 답변에서 제거
다른 목록에서 목록의 모든 값을 제거하는 방법을 찾고 있습니다.
이 같은:
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
'IT story' 카테고리의 다른 글
bash에서 현재 파티션의 사용 가능한 디스크 공간 확인 (0) | 2020.08.05 |
---|---|
MySQL 최대 메모리 사용량 (0) | 2020.08.05 |
숭고한 텍스트처럼 Vim 멀티 라인 편집? (0) | 2020.08.05 |
CSS 그리드를 중심으로 (0) | 2020.08.05 |
사용자 정의 클래스 목록 정렬 (0) | 2020.08.05 |