복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    3.

    sorted(x) == sorted(y)
    

    여기에서 복사 : 정렬되지 않은 두 개의 목록이 같은지 확인하십시오

    나는 이것이이 질문에 대한 최선의 대답이라고 생각한다.

  4. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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
    
  9. from https://stackoverflow.com/questions/9623114/check-if-two-unordered-lists-are-equal by cc-by-sa and MIT license