본문 바로가기
개발일지/Python

** 파이썬 최빈값 알고리즘1, 빈도수에 따라서 +표시출력

by 개발에정착하고싶다 2022. 5. 22.
320x100

**최빈값을 구해줄때는 최대값이 존재해야 한다.*

 

첫번째 파일

ex

 

# 최빈값 알고리즘

import modeMod
import maxMode

ages = [25,27,27,24,31,34,33,31,29,25,45,37,38,46,47,22,24,29,33,35,
        27,34,37,40,42,29,27,25,26,27,31,31,32,38,25,27,28,40,41,34]

print(f'employee cnt: {len(ages)}명')

# maxMode모듈을 통해서 최대값을 구해주는 과정
maxAlo = maxMode.MaxAlgorithm(ages)
maxAlo.setMaxIdxAndNum()
maxAge = maxAlo.getMaxNum()
print(f'maxAge: {maxAge}세')

# 위의 maxMode로 통해서 구해진 최대값을 통해서 최빈값을 구해주기
modAlo = modeMod.ModeAlgorithm(ages, maxAge)
modAlo.setIndexList()
# 인덱스에 해당하는 48개의 0이 담긴 리스트
print(f'IndexList: {modAlo.getIndexList()}')

modAlo.printAges()

 

두번째 파일

maxMode

 

# 최대값 알고리즘
# 최빈값 알고리즘을 구할때 필요하다고 한다.

class MaxAlgorithm:

    def __init__(self, ns):
        self.nums = ns
        self.maxNum = 0
        self.maxNumIdx = 0

    def setMaxIdxAndNum(self):
        self.maxNum = 0
        self.maxNumIdx = 0

        for i, n in enumerate(self.nums):
            if self.maxNum < n:
                self.maxNum = n
                self.maxNumIdx = i

    def getMaxNum(self):
        return self.maxNum

    def getMaxIdx(self):
        return self.maxNumIdx

 

세번째 파일

modeMod

 

import maxMode

class ModeAlgorithm:

    def __init__(self,ns, mn):
        self.nums = ns
        self.maxNum = mn
        self.indexes = []

    def setIndexList(self):
        self.indexes = [0 for i in range(self.maxNum + 1)]

        for n in self.nums:
            self.indexes[n] = self.indexes[n] + 1

    def getIndexList(self):
        # 초기화가 되지 않은경우 초기화 해주는거고
        if sum(self.indexes) == 0:
            return None
        # 초기화가 되어있는 경우
        else:
            return self.indexes

    def printAges(self):

        n = 1
        while True:

            maxAlo = maxMode.MaxAlgorithm(self.indexes)
            maxAlo.setMaxIdxAndNum()
            maxNum = maxAlo.getMaxNum()
            maxNumIdx = maxAlo.getMaxIdx()

            # 초기화가안된경우
            if maxNum ==0:
                break

            # {n:0>3} 총 3자리를 채워주되 왼쪽정렬을 해준다는 의미
            print(f'[{n:0>3}] {maxNumIdx}세 빈도수: {maxNum} \t',end='')
            print('+' * maxNum)
            self.indexes[maxNumIdx] = 0

            n += 1
300x250