이 질문은 이전 질문과 관련이있는 것처럼 보일 수 있지만 (예 : Python, compute list difference ) 정확히 동일하지 않으며 두 가지 제안을 포함하는 최고 등급의 답변조차 다음 질문에 정확히 대답하지 않습니다.
L
중복 된 값을 포함 하는 기본 (순서없는) 목록 이 있습니다. 예를 들어 정수 목록을 가져옵니다.
L = [3, 1, 4, 1, 5, 9, 2, 6, 5]
예를 들어 L에서 값을 선택하는 더 작은 목록이 있습니다.
x = [4, 1, 3]
의 요소 순서는의 요소 순서 x
와 관련이 없습니다 L
.
이제 L-x
연결 x
과이 차이가 L
(순서를 제외하고) 같은 목록을 제공 하는 방식으로 차이를 계산하고 싶습니다 . 더 정확하게 말하면 :
list(sorted(x + D(L,x))) == list(sorted(L))
첫 번째 나쁜 아이디어 는 분명히 세트를 사용하는 것입니다. 복제는 올바르게 처리되지 않기 때문입니다.
두 번째 나쁜 생각 은 다음과 같은 필터와 함께 목록 이해력을 사용하는 것입니다.
[ e for e in L if e not in x ]
1
이 값의 한 인스턴스가 예상되는 차이에서 발생해야하지만 내 예제 의 값 이 삭제되기 때문입니다.
내가 볼 수있는 한,이를 수행하는 가장 효율적인 방법은 두 목록을 모두 정렬 한 다음 두 목록을 반복하고 (반복자가 도움이 될 수 있음) 중복을 신중하게 고려하는 것입니다. 이것은 O (n log n) 솔루션입니다.
나는 속도를 찾고 있지 않습니다. 나는 간결한 파이썬 구문이 그것을 할 수 있는지 궁금합니다. 심지어 O (n²) 또는 악화가 하나 개 또는 두 개의 라인에서 예상되는 작업을 할 수있는 경우에 허용 될 수 있습니다.
에서 제공하는 다중 집합 작업을 원합니다 collections.Counter
.
>>> L = [3, 1, 4, 1, 5, 9, 2, 6, 5]
>>> x = [4, 1, 3]
>>> list((Counter(L) - Counter(x)).elements())
[1, 5, 5, 9, 2, 6]
이것은 O (n) 입니다. 필요한 경우를 사용하여 순서를 유지하고 O (n) 을 유지할 수도 있습니다 OrderedCounter
.
from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
pass
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras