데이터 분석을 하다 보면 다양한 문제에 직면하게 됩니다. 이 글에서는 숫자로 구성된 리스트가 주어졌을 때, 그 안에서 값의 차이가 가장 큰 요소 쌍(pair)을 찾는 방법을 예제와 함께 살펴보겠습니다.
1. heapq의 nlargest 활용하기
이 방법은 먼저 리스트에서 만들 수 있는 모든 요소 조합을 생성한 뒤, 각 조합에서 두 요소의 차이(절댓값)를 계산합니다. 마지막으로 heapq 모듈의 nlargest 함수를 사용해 차이가 가장 큰 상위 n개의 쌍을 추출합니다. 여러 개의 후보 쌍을 한 번에 확인하고 싶을 때 유용합니다.
예제 코드
from itertools import combinations
from heapq import nlargest
listA = [21, 14, 30, 11, 17, 18]
# 주어진 리스트
print("Given list : ", listA)
# nlargest와 combinations() 활용
res = nlargest(2, combinations(listA, 2),
key=lambda sub: abs(sub[0] - sub[1]))
# 결과 출력
print("Pairs with maximum difference are : ", res)
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Given list : [21, 14, 30, 11, 17, 18] Pairs with maximum difference are : [(30, 11), (14, 30)]
2. combinations과 max() 함수 활용하기
이 방법도 앞선 방법과 동일하게 조합을 생성하지만, max 함수를 적용하기 때문에 결과로 최대 차이를 가지는 단 하나의 쌍만 반환됩니다. 최댓값 차이를 가지는 쌍 하나만 필요하다면 이 방식이 더 간결합니다.
예제 코드
from itertools import combinations
listA = [21, 14, 30, 11, 17, 18]
# 주어진 리스트
print("Given list : ", listA)
# combinations()와 lambda 활용
res = max(combinations(listA, 2), key=lambda sub: abs(sub[0] - sub[1]))
# 결과 출력
print("Pairs with maximum difference are : ", res)
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Given list : [21, 14, 30, 11, 17, 18] Pairs with maximum difference are : (30, 11)
3. 참고: 더 효율적인 방법 (O(n))
위 두 방식은 combinations를 사용하기 때문에 시간 복잡도가 O(n²)입니다. 리스트의 요소 개수가 많아지면 성능이 저하될 수 있습니다. 사실 절댓값 기준 최대 차이는 항상 '최댓값과 최솟값'의 쌍에서 발생하므로, 다음처럼 min()과 max()만 사용하면 O(n)에 해결할 수 있습니다.
listA = [21, 14, 30, 11, 17, 18]
res = (max(listA), min(listA))
diff = max(listA) - min(listA)
print("Pairs with maximum difference are : ", res) # (30, 11)
print("Maximum difference : ", diff) # 19
정리
- 상위 여러 개의 쌍이 필요하다면 → nlargest + combinations
- 최대 차이를 가지는 쌍 하나만 필요하다면 → max + combinations
- 대량의 데이터에서 성능이 중요하다면 → min()과 max() 조합