programing

순서가 매겨지지 않은 두 리스트가 동일한지 확인합니다.

bestcode 2023. 1. 31. 20:49
반응형

순서가 매겨지지 않은 두 리스트가 동일한지 확인합니다.

순서 없는 2개의 리스트에 같은 요소가 포함되어 있는지를 간단하게(빠르게) 판별할 수 있는 방법을 찾고 있습니다.

예를 들어 다음과 같습니다.

['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

지도를 사용하지 않고 이걸 하고 싶어요.

Python은 순서가 없는 (해시 가능한) 것들을 위한 내장 데이터 타입을 가지고 있다.set. 두 목록을 세트로 변환하면 비교 순서가 정해지지 않습니다.

set(x) == set(y)

에 관한 문서set


EDIT: @mdwhatcott는 중복 여부를 확인하고 싶다고 지적합니다. set에서는 이러한 정보가 무시되기 때문에 각 목록의 항목 수를 추적하는 유사한 데이터 구조가 필요합니다.이것을 멀티셋이라고 부릅니다.표준 라이브러리에서 최적인 근사치는 다음과 같습니다.

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

요소가 항상 예시와 같이 거의 정렬되어 있는 경우 기본 제공.sort()(timsort)는 빨라야 합니다.

>>> a = [1,1,2]
>>> b = [1,2,2]
>>> a.sort()
>>> b.sort()
>>> a == b
False

정렬을 하고 싶지 않은 경우 를 사용할 수 있습니다.

실제에서는 항상 더 빠를 수 있습니다.collections.Counter()(점근적으로 증가)O(n)그때가 좋으면O(n*log(n))위해서.sort()중요할 경우 측정한다.

sorted(x) == sorted(y)

여기서 복사:순서가 매겨지지 않은 두 리스트가 동일한지 확인합니다.

저는 이게 이 질문에 대한 가장 좋은 대답이라고 생각합니다. 왜냐하면

  1. 답변에서 지적한 바와 같이 카운터를 사용하는 것보다 낫다.
  2. x.sort()는 부작용인 x를 정렬합니다.sorted(x)는 새 목록을 반환합니다.

동일한 요소가 포함되어 있는지 확인하고 싶지만 순서는 신경 쓰지 않습니다.

세트를 사용할 수 있습니다.

>>> set(['one', 'two', 'three']) == set(['two', 'one', 'three'])
True

그러나 집합 개체 자체에는 각 고유한 값의 인스턴스가 하나만 포함되어 순서가 유지되지 않습니다.

>>> set(['one', 'one', 'one']) == set(['one'])
True

따라서 중복된 길이/길이를 추적하는 것이 중요한 경우 다음과 같은 길이도 확인할 수 있습니다.

def are_eq(a, b):
    return set(a) == set(b) and len(a) == len(b)

리스트의 사이즈가 같은 것을 이미 알고 있는 경우, 2개의 벡터가 완전히 같은 경우(순서 포함)만 True를 보증합니다.

functools.reduce(lambda b1,b2: b1 and b2, map(lambda e1,e2: e1==e2, listA, ListB), True)

예:

>>> from functools import reduce
>>> def compvecs(a,b):
...     return reduce(lambda b1,b2: b1 and b2, map(lambda e1,e2: e1==e2, a, b), True)
... 
>>> compvecs(a=[1,2,3,4], b=[1,2,4,3])
False
>>> compvecs(a=[1,2,3,4], b=[1,2,3,4])
True
>>> compvecs(a=[1,2,3,4], b=[1,2,4,3])
False
>>> compare_vectors(a=[1,2,3,4], b=[1,2,2,4])
False
>>> 

컬렉션 라이브러리를 사용하지 않을 경우 항상 다음과 같은 작업을 수행할 수 있습니다.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양쪽 리스트가 같은 경우는, 같은 요소와 같은 순서로 포함합니다. False렇지지그

따라서 위의 첫 번째 응답과 같이 비교 함수를 정의할 수 있지만 컬렉션 라이브러리는 정의할 수 없습니다.

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

위의 질문에 대한 한 가지 답변은 다음과 같습니다.

2개의 리스트를 list1과 list2로 하고, 2개의 리스트가 같은 요소를 가지고 있는지 확인하는 것이 요구됩니다.그러면 다음 방법이 최선입니다.-

if ((len(list1) == len(list2)) and
   (all(i in list2 for i in list1))):
    print 'True'
else:
    print 'False'

위의 코드는 list1의 모든 요소가 list2에 있는지 여부와 그 반대인지에 따라 사용자의 필요에 따라 작동합니다.

단, list1의 모든 요소가 list2에 존재하는지 여부를 확인하려면 다음 코드 조각만 사용해야 합니다.

if all(i in list2 for i in list1):
    print 'True'
else:
    print 'False'

차이점은 list2에 list1의 모든 요소와 함께 추가 요소가 포함되어 있는 경우 나중에 True가 출력된다는 것입니다.간단히 말하면 list2에 추가 요소가 있는지 여부에 관계없이 list1의 모든 요소가 list2에 존재해야 합니다.

리스트의 문자열 표현을 가져와 비교하는 것은 어떨까요?

>>> l1 = ['one', 'two', 'three']
>>> l2 = ['one', 'two', 'three']
>>> l3 = ['one', 'three', 'two']
>>> print str(l1) == str(l2)
True
>>> print str(l1) == str(l3)
False

언급URL : https://stackoverflow.com/questions/9623114/check-if-two-unordered-lists-are-equal

반응형