행렬(리스트의 리스트)에서 가장 자주 등장하는 조합을 찾아야 할 때는 간단한 반복문과 함께 sort 메서드, Counter 메서드를 활용하면 됩니다. 이 글에서는 Python의 collections.Counter와 itertools.combinations를 사용해 각 하위 리스트에서 만들 수 있는 모든 조합의 빈도를 계산하고, 최빈값에 해당하는 조합들을 추출하는 방법을 소개합니다.
예제 코드
아래는 실제 동작을 보여주는 예제입니다.
from collections import Counter
from itertools import combinations
my_list = [[31, 25, 77, 82], [96, 15, 23, 32]]
print("The list is :")
print(my_list)
my_result = Counter()
for elem in my_list:
if len(elem) < 2:
continue
elem.sort()
for size in range(2, len(elem) + 1):
for comb in combinations(elem, size):
my_result[comb] += 1
my_result = [elem for elem, my_count in my_result.items() if my_count ==
my_result.most_common(1)[0][1]]
print("The result is :")
print(my_result)실행 결과
The list is : [[31, 25, 77, 82], [96, 15, 23, 32]] The result is : [(15, 23, 32, 96), (25, 31), (25, 82), (15, 32), (23, 32), (15, 32, 96), (25, 31, 82), (15, 23), (25, 77), (15, 23, 32), (25, 77, 82), (32, 96), (31, 77, 82), (15, 96), (31, 77), (23, 96), (25, 31, 77, 82), (31, 82), (77, 82), (23, 32, 96), (15, 23, 96), (25, 31, 77)]
코드 설명
필요한 패키지(
Counter,combinations)를 환경에 임포트합니다.리스트 안에 리스트가 포함된 구조(행렬)를 정의하고 콘솔에 출력합니다.
Counter객체를 변수에 할당하여 각 조합의 등장 횟수를 저장할 준비를 합니다.바깥 리스트를 순회하며 각 하위 리스트를 확인합니다.
하위 리스트의 길이가 2보다 작은지 검사하는 조건을 둡니다.
길이가 2 미만이면 조합을 만들 수 없으므로
continue로 다음 요소로 넘어갑니다.그렇지 않은 경우,
sort메서드로 리스트의 요소들을 오름차순 정렬합니다. 정렬을 하면 같은 조합이 항상 동일한 순서로 생성되어 카운트가 정확해집니다.크기를 2부터 리스트 길이까지 늘려가며
combinations메서드로 모든 조합을 생성하고, 해당 조합의 카운트를 1씩 증가시킵니다.이후 리스트 컴프리헨션(list comprehension)을 사용해 가장 높은 빈도(
most_common(1)[0][1])와 카운트가 같은 조합들만 필터링합니다.필터링된 결과를 변수에 할당합니다.
최종 결과를 콘솔에 출력합니다.
참고 사항
이 예제에서는 두 하위 리스트의 요소들이 서로 겹치지 않기 때문에 모든 조합이 한 번씩만 등장하며, 따라서 최대 빈도가 1인 모든 조합이 결과로 출력됩니다. 만약 여러 하위 리스트에 공통으로 나타나는 값들이 있다면, 그 조합들의 카운트가 더 높아져 진짜 '가장 일반적인' 조합만 필터링되어 출력됩니다. 또한 elem.sort()는 원본 리스트를 직접 변경하므로, 원본을 유지해야 하는 경우에는 sorted(elem)을 사용하는 것이 좋습니다.