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

파이썬으로 특정 쌍의 합이 존재하는 행만 필터링하는 방법

개요

리스트 안에 여러 개의 행(내부 리스트)이 있을 때, 두 요소의 합이 특정 키 값과 일치하는 쌍이 포함된 행만 골라내야 하는 경우가 있습니다. 이럴 때는 별도의 함수를 정의하여 각 행을 검사하고, 조건을 만족하는 행만 새로운 리스트로 추출하면 됩니다.

아래 예제에서는 중첩 반복문을 사용해 한 행 내의 모든 요소 쌍을 확인하고, 그 합이 키 값과 같으면 True를 반환하는 방식으로 문제를 해결합니다.

예제 코드

def find_sum_pair(val, key):

   for index in range(len(val)):
      for ix in range(index + 1, len(val)):
         if val[index] + val[ix] == key:
            return True
   return False

my_list = [[71, 5, 21, 6], [34, 21, 2, 71], [21, 2, 34, 5], [6, 9, 21, 42]]

print("The list is :")
print(my_list)

my_key = 76
print("The key is ")
print(my_key)

my_result = [element for element in my_list if find_sum_pair(element, my_key)]

print("The resultant list is :")
print(my_result)

실행 결과

The list is :
[[71, 5, 21, 6], [34, 21, 2, 71], [21, 2, 34, 5], [6, 9, 21, 42]]
The key is
76
The resultant list is :
[[71, 5, 21, 6]]

동작 원리 상세 설명

  • find_sum_pair 함수 정의: 리스트와 키 값을 매개변수로 받는 함수를 정의합니다.

  • 중첩 반복문으로 모든 쌍 탐색: 바깥쪽 반복문은 첫 번째 요소를, 안쪽 반복문은 그 다음 요소부터 순회하며 서로 다른 인덱스에 있는 두 요소의 조합을 모두 확인합니다.

  • 합 비교: 두 요소의 합이 두 번째 매개변수인 키 값과 일치하는지 검사합니다.

  • 조건 만족 시: 일치하는 쌍을 찾으면 즉시 True를 반환하여 불필요한 연산을 줄입니다.

  • 조건 불만족 시: 끝까지 탐색했는데도 일치하는 쌍이 없다면 False를 반환합니다.

  • 데이터 준비: 함수 외부에서 리스트의 리스트(중첩 리스트)를 정의하고 콘솔에 출력합니다.

  • 키 값 설정: 찾고자 하는 합계 목표값인 키를 변수에 저장합니다.

  • 리스트 컴프리헨션 활용: 리스트 컴프리헨션을 사용해 각 행을 순회하면서 find_sum_pair 함수를 호출하고, True가 반환된 행만 결과 리스트에 담습니다.

  • 결과 출력: 최종 필터링된 리스트를 콘솔에 출력합니다.

추가 팁: 더 효율적인 접근 방법

위 방법의 시간 복잡도는 O(n²)입니다. 행의 길이가 길어지면 성능이 떨어질 수 있으므로, 집합(set)을 활용하면 O(n)으로 개선할 수 있습니다.

def find_sum_pair_fast(val, key):
    seen = set()
    for num in val:
        if key - num in seen:
            return True
        seen.add(num)
    return False

각 요소를 순회하며 '키 값에서 현재 요소를 뺀 값'이 이미 등장했는지 집합에서 O(1)로 확인하는 방식입니다. 대용량 데이터를 다룰 때는 이 방법을 사용하는 것이 좋습니다.