[PYTHON] 두 개의 정렬되지 않은 목록이 같은지 확인 [duplicate]
PYTHON두 개의 정렬되지 않은 목록이 같은지 확인 [duplicate]
두 개의 정렬되지 않은 목록에 동일한 요소가 포함되어 있는지 확인하기위한 쉬운 방법을 찾고 있습니다.
예 :
['one', 'two', 'three'] == ['one', 'two', 'three'] : true
['one', 'two', 'three'] == ['one', 'three', 'two'] : true
['one', 'two', 'three'] == ['one', 'two', 'three', 'three'] : false
['one', 'two', 'three'] == ['one', 'two', 'three', 'four'] : false
['one', 'two', 'three'] == ['one', 'two', 'four'] : false
['one', 'two', 'three'] == ['one'] : false
지도를 사용하지 않고이 작업을 수행하고 싶습니다.
해결법
-
==============================
1.파이썬에는 집합이라고 불리는 순서없는 (해시 가능한) 컬렉션을위한 내장 데이터 유형이 있습니다. 두 목록을 집합으로 변환하면 비교는 순서가 지정되지 않습니다.
파이썬에는 집합이라고 불리는 순서없는 (해시 가능한) 컬렉션을위한 내장 데이터 유형이 있습니다. 두 목록을 집합으로 변환하면 비교는 순서가 지정되지 않습니다.
set(x) == set(y)
세트에 관한 문서
편집 : @ mdwhatcott 당신이 중복 확인하고 싶습니다 지적했다. set은 이것을 무시하므로 각 목록의 항목 수를 추적하는 유사한 데이터 구조가 필요합니다. 이를 다중 세트라고합니다. 표준 라이브러리에서 가장 근사값은 collections.Counter입니다 :
>>> import collections >>> compare = lambda x, y: collections.Counter(x) == collections.Counter(y) >>> >>> compare([1,2,3], [1,2,3,3]) False >>> compare([1,2,3], [1,2,3]) True >>> compare([1,2,3,3], [1,2,2,3]) False >>>
-
==============================
2.당신의 예제처럼 요소가 항상 거의 정렬된다면, 내장 .sort () (timsort)는 빠르다 :
당신의 예제처럼 요소가 항상 거의 정렬된다면, 내장 .sort () (timsort)는 빠르다 :
>>> a = [1,1,2] >>> b = [1,2,2] >>> a.sort() >>> b.sort() >>> a == b False
당신이 inplace 정렬하려는 경우 sorted () 사용할 수 있습니다.
실제로는 항상 더 빠를 수도 있습니다. 집 () (.sort ()에 대해 점근 적으로 O (n) 시간이 더 나음에도 불구하고 O (n * log (n))에도 불구하고. 그것을 측정하십시오; 그것이 중요하다면.
-
==============================
3.
sorted(x) == sorted(y)
여기에서 복사 : 정렬되지 않은 두 개의 목록이 같은지 확인하십시오
나는 이것이이 질문에 대한 최선의 대답이라고 생각한다.
-
==============================
4.동일한 요소가 포함되어 있는지 확인하려고하지만 순서는 신경 쓰지 않아야합니다.
동일한 요소가 포함되어 있는지 확인하려고하지만 순서는 신경 쓰지 않아야합니다.
세트를 사용할 수 있습니다 :
>>> set(['one', 'two', 'three']) == set(['two', 'one', 'three']) True
그러나 set 객체 자체에는 각 고유 값의 인스턴스가 하나만 포함되며 순서는 유지되지 않습니다.
>>> set(['one', 'one', 'one']) == set(['one']) True
따라서 중복 / 길이를 추적하는 것이 중요하다면 길이를 확인하는 것이 좋습니다.
def are_eq(a, b): return set(a) == set(b) and len(a) == len(b)
-
==============================
5.콜렉션 라이브러리를 사용하고 싶지 않다면 항상 다음과 같이 할 수 있습니다 : a와 b가리스트 인 경우 다음은 일치하는 요소의 수를 반환합니다 (순서는 고려합니다).
콜렉션 라이브러리를 사용하고 싶지 않다면 항상 다음과 같이 할 수 있습니다 : a와 b가리스트 인 경우 다음은 일치하는 요소의 수를 반환합니다 (순서는 고려합니다).
sum([1 for i,j in zip(a,b) if i==j])
따라서,
len(a)==len(b) and len(a)==sum([1 for i,j in zip(a,b) if i==j])
두 목록이 같고 동일한 요소를 포함하며 같은 순서로 있으면 True입니다. 그렇지 않으면 거짓.
그래서, 위의 첫 번째 응답과 같은 compare 함수를 정의 할 수 있지만 collections 라이브러리는 없다.
compare = lambda a,b: len(a)==len(b) and len(a)==sum([1 for i,j in zip(a,b) if i==j])
과
>>> compare([1,2,3], [1,2,3,3]) False >>> compare([1,2,3], [1,2,3]) True >>> compare([1,2,3], [1,2,4]) False
-
==============================
6.위의 질문에 대한 하나의 라이너 대답은 다음과 같습니다.
위의 질문에 대한 하나의 라이너 대답은 다음과 같습니다.
두리스트를 list1과 list2, 그리고 귀하의 요구 사항은 두 목록이 같은 요소를 가지고 있는지 확인하는 것입니다, 그리고 나처럼, 다음과 같은 최선의 접근 방식이 될 것입니다 :
if ((len(list1) == len(list2)) and (all(i in list2 for i in list1))): print 'True' else: print 'False'
위 코드는 list1의 모든 요소가 list2와 vice-verse에 있는지 여부에 따라 필요에 따라 작동합니다.
그러나 list1의 모든 요소가 list2에 있는지 여부를 확인하려면 다음 코드 조각 만 사용해야합니다.
if all(i in list2 for i in list1): print 'True' else: print 'False'
차이점은 list2에 list1의 모든 요소와 함께 몇 가지 추가 요소가 포함되어 있으면 나중에 true가 인쇄된다는 것입니다. 간단히 말해서, list2에 몇 가지 추가 요소가 있는지 여부에 관계없이 list1의 모든 요소가 list2에 있어야합니다.
-
==============================
7.리스트가 같은 크기를 가지고 있다는 것을 이미 알고 있다고 가정하면, 다음은 두 벡터가 정확히 같고 (순서 포함)
리스트가 같은 크기를 가지고 있다는 것을 이미 알고 있다고 가정하면, 다음은 두 벡터가 정확히 같고 (순서 포함)
functools.reduce(lambda b1,b2: b1 and b2, map(lambda e1,e2: e1==e2, listA, ListB), True)
예: >>> functools에서 가져 오기 reduce >>> def compvecs (a, b) : ... return reduce (lambda b1, b2 : b1과 b2, map (lambda1, e2 : e1 == e2, a, b), True) ... >>> compvecs (a = [1,2,3,4], b = [1,2,4,3]) 그릇된 >>> compvecs (a = [1,2,3,4], b = [1,2,3,4]) 참된 >>> compvecs (a = [1,2,3,4], b = [1,2,4,3]) 그릇된 >>> compare_vectors (a = [1,2,3,4], b = [1,2,2,4]) 그릇된 >>>
-
==============================
8.목록의 문자열 표현을 가져 와서 비교하는 것은 어떻습니까?
목록의 문자열 표현을 가져 와서 비교하는 것은 어떻습니까?
>>> l1 = ['one', 'two', 'three'] >>> l2 = ['one', 'two', 'three'] >>> l3 = ['one', 'three', 'two'] >>> print str(l1) == str(l2) True >>> print str(l1) == str(l3) False
from https://stackoverflow.com/questions/9623114/check-if-two-unordered-lists-are-equal by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 파이썬 목록에서 두 항목의 위치를 전환하는 방법은 무엇입니까? (0) | 2018.10.09 |
---|---|
[PYTHON] python : urllib2 urlopen 요청으로 쿠키를 보내는 방법 (0) | 2018.10.09 |
[PYTHON] urllib2 유니 코드로 읽음 (0) | 2018.10.09 |
[PYTHON] Numpy를 사용하여 파생 상품을 계산하려면 어떻게해야합니까? (0) | 2018.10.09 |
[PYTHON] Borg 패턴이 파이썬의 싱글 톤 패턴보다 나은 이유는 무엇입니까? (0) | 2018.10.09 |