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

Python 리스트에서 최대 차이를 가지는 요소 쌍 찾기

데이터 분석을 하다 보면 다양한 문제에 직면하게 됩니다. 이 글에서는 숫자로 구성된 리스트가 주어졌을 때, 그 안에서 값의 차이가 가장 큰 요소 쌍(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() 조합