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

Python – 행렬(Matrix)에서 가장 자주 등장하는 조합 찾는 방법

행렬(리스트의 리스트)에서 가장 자주 등장하는 조합을 찾아야 할 때는 간단한 반복문과 함께 sort 메서드, Counter 메서드를 활용하면 됩니다. 이 글에서는 Python의 collections.Counteritertools.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)을 사용하는 것이 좋습니다.