[PYTHON] 한 목록의 모든 값을 다른 목록에서 제거 하시겠습니까? [복제]
PYTHON한 목록의 모든 값을 다른 목록에서 제거 하시겠습니까? [복제]
다른 목록에서 목록 내의 모든 값을 제거하는 방법을 찾고 있습니다.
이 같은:
a = range(1,10)
a.remove([2,3,7])
print a
a = [1,4,5,6,8,9]
해결법
-
==============================
1.
>>> a = range(1, 10) >>> [x for x in a if x not in [2, 3, 7]] [1, 4, 5, 6, 8, 9]
-
==============================
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.주제를 빨리 수행 할 방법을 찾고 있었기 때문에 제안 된 방법으로 몇 가지 실험을했습니다. 그리고 나는 결과에 놀랐다. 그래서 나는 당신과 그것을 나누고 싶다.
주제를 빨리 수행 할 방법을 찾고 있었기 때문에 제안 된 방법으로 몇 가지 실험을했습니다. 그리고 나는 결과에 놀랐다. 그래서 나는 당신과 그것을 나누고 싶다.
실험은 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.
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.다른 사람들은 필터링 후 새 목록을 만드는 방법을 제안했습니다.
다른 사람들은 필터링 후 새 목록을 만드는 방법을 제안했습니다.
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.가장 간단한 방법은
가장 간단한 방법은
>>> 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.
>>> 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]
from https://stackoverflow.com/questions/2514961/remove-all-values-within-one-list-from-another-list by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬에서 상대 경로에서 가져 오기 (0) | 2018.10.18 |
---|---|
[PYTHON] Python 사전을 JSON 배열로 변환 (0) | 2018.10.18 |
[PYTHON] 오류 : "사전 업데이트 시퀀스 요소 # 0의 길이는 1입니다. 2 필요합니다 "Django 1.4 (0) | 2018.10.18 |
[PYTHON] 파이썬 2.7 지원 끝? (0) | 2018.10.18 |
[PYTHON] pycrypto (RSA)를 사용하여 데이터 서명 및 확인 (0) | 2018.10.18 |