Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python – 모든 행이 다른 행렬과 공통 요소를 포함하는지 확인하는 방법

개요

두 개의 행렬(중첩 리스트)이 있을 때, 첫 번째 행렬의 모든 행이 두 번째 행렬의 같은 위치 행과 최소 한 개 이상의 공통 요소를 가지는지 확인해야 하는 경우가 있습니다. 이럴 때는 간단한 반복문과 플래그(flag) 변수를 활용하면 손쉽게 해결할 수 있습니다.

예제

아래는 이를 구현한 예제 코드입니다.

my_list_1 = [[3, 16, 1], [2, 4], [4, 31, 31]]
my_list_2 = [[42, 16, 12], [42, 8, 12], [31, 7, 10]]

print("The first list is :")
print(my_list_1)
print("The second list is :")
print(my_list_2)

my_result = True

for idx in range(0, len(my_list_1)):

    temp = False

    for element in my_list_1[idx]:
        if element in my_list_2[idx]:
            temp = True
            break

    if not temp:
        my_result = False
        break

if(temp == True):
    print("The two matrices contain common elements")
else:
    print("The two matrices don't contain common elements")

출력 결과

The first list is :
[[3, 16, 1], [2, 4], [4, 31, 31]]
The second list is :
[[42, 16, 12], [42, 8, 12], [31, 7, 10]]
The two matrices don't contain common elements

코드 설명

  • 두 개의 리스트(리스트 안에 리스트가 들어 있는 구조)가 정의되고 콘솔에 출력됩니다.

  • 최종 결과를 저장할 변수가 Boolean 값 True로 초기화됩니다.

  • 첫 번째 리스트를 행 단위로 순회하며, 각 행을 검사하기 전에 임시 변수를 Boolean 값 False로 설정합니다.

  • 현재 행의 요소가 두 번째 리스트의 같은 인덱스 행에 존재하면, 임시 변수를 Boolean 값 True로 변경합니다.

  • 공통 요소를 찾으면 break 문으로 내부 반복문을 즉시 종료하여 불필요한 비교를 줄입니다.

  • 내부 반복문이 끝난 후에도 임시 변수가 False라면 해당 행에 공통 요소가 없다는 의미이므로, 결과 변수를 False로 바꾸고 전체 반복문을 종료합니다.

  • 마지막으로 임시 변수의 값에 따라 적절한 메시지가 콘솔에 출력됩니다.

더 간결한 대안: 집합과 all() 활용

위 코드는 로직을 단계별로 명확히 보여주지만, 파이썬에서는 zip(), all()과 집합 교집합 연산을 조합하면 훨씬 간결하고 가독성 좋게 표현할 수 있습니다.

result = all(bool(set(a) & set(b)) for a, b in zip(my_list_1, my_list_2))

if result:
    print("두 행렬은 공통 요소를 포함합니다")
else:
    print("두 행렬은 공통 요소를 포함하지 않습니다")

set(a) & set(b)는 두 행의 교집합을 구하는 연산으로, 리스트의 in 검색(O(n))보다 집합 기반 조회(O(1))가 빠르기 때문에 데이터가 클수록 성능 면에서도 유리합니다. 또한 코드의 의도를 한 줄로 명확하게 드러낼 수 있다는 장점이 있습니다.