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

Python 튜플 리스트에서 상위 K개 빈도 높은 요소 찾는 방법

튜플로 구성된 리스트가 있을 때, 그중에서 값이 큰 순서대로 상위 K개의 요소를 찾아야 하는 경우가 자주 있습니다. 예를 들어 K가 3이라면 리스트 안의 튜플들 중에서 상위 3개 요소를 추출하면 됩니다.

이 글에서는 defaultdict를 활용하는 방법과 sorted + itemgetter를 활용하는 방법, 총 두 가지 접근 방식을 예제 코드와 함께 살펴보겠습니다.

1. defaultdict 활용 방법

collections 모듈의 defaultdict를 사용하면 튜플의 첫 번째 요소(요일)를 키로, 두 번째 요소(숫자)를 값으로 묶어 딕셔너리 형태로 정리할 수 있습니다. 이후 각 키별로 값을 합산한 뒤, 내림차순으로 정렬하여 상위 K개만 추출하는 방식입니다.

예제 코드

import collections
from operator import itemgetter
from itertools import chain

# 입력 리스트 초기화
listA = [[('Mon', 126)], [('Tue', 768)],[('Wed', 512)], [('Thu', 13)],[('Fri', 341)]]

# K 값 설정
K = 3

# 주어진 리스트 출력
print("Given list:\n",listA)
print("Check value:\n",K)

# defaultdict 사용
dict_ = collections.defaultdict(list)
new_list = list(chain.from_iterable(listA))
for elem in new_list:
    dict_[elem[0]].append(elem[1])
res = {k: sum(v) for k, v in dict_.items()}

# sorted로 정렬 후 상위 K개 추출
res = sorted(res.items(), key=itemgetter(1),
reverse=True)[0:K]

# 결과 출력
print("Top 3 elements are:\n", res)

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

Given list:
[[('Mon', 126)], [('Tue', 768)], [('Wed', 512)], [('Thu', 13)], [('Fri', 341)]]
Check value:
3
Top 3 elements are:
[('Tue', 768), ('Wed', 512), ('Fri', 341)]

여기서 chain.from_iterable()은 중첩된 리스트를 하나의 평탄한 리스트로 만들어 주고, itemgetter(1)는 튜플의 두 번째 요소(숫자)를 기준으로 정렬하도록 지정합니다.

2. sorted와 itemgetter 활용 방법

두 번째 방법은 더 간결합니다. itemgetter 함수를 sorted 함수 내부의 key 인자로 직접 적용하고, 슬라이싱 범위를 [0:K]로 지정하여 한 번에 상위 K개를 추출합니다. 별도의 딕셔너리 변환 과정 없이 바로 정렬이 가능하다는 장점이 있습니다.

예제 코드

from operator import itemgetter
from itertools import chain

# 입력 리스트 초기화
listA = [[('Mon', 126)], [('Tue', 768)],[('Wed', 512)], [('Thu', 13)],[('Fri', 341)]]

# K 값 설정
K = 3

# 주어진 리스트 출력
print("Given list:\n",listA)
print("Check value:\n",K)

# sorted 사용
res = sorted(list(chain.from_iterable(listA)),
    key = itemgetter(1), reverse = True)[0:K]

# 결과 출력
print("Top 3 elements are:\n", res)

실행 결과

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

Given list:
[[('Mon', 126)], [('Tue', 768)], [('Wed', 512)], [('Thu', 13)], [('Fri', 341)]]
Check value:
3
Top 3 elements are:
[('Tue', 768), ('Wed', 512), ('Fri', 341)]

정리

두 방법 모두 동일한 결과인 ('Tue', 768), ('Wed', 512), ('Fri', 341)을 반환합니다. 데이터를 키별로 그룹화하고 합산해야 하는 경우에는 defaultdict 방식이 유리하고, 단순히 값 기준으로 상위 K개만 필요하다면 sorted와 itemgetter를 조합한 두 번째 방법이 더 간단하고 효율적입니다.