Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

RUBY

순위Rank (파이썬) 본문

프로그래밍 언어/Python

순위Rank (파이썬)

ruby-jieun 2023. 1. 25. 20:10

 

 

 

순위


 

 

 

수의 크고 작음을 이용해서 수의 순서를 정하는 것을 순위라고 한다.

rank 함수는 주어진 값들을 이용하여 작은 값부터 1등이라고 순위를 매긴다.
 

method: 중복된 값이 있을 때 랭킹을 어떻게 매길지를 지정한다. 예를 들어 배열 [5, 6, 6, 6, 7]에 대해 [1, 2, 3, 4, 5]라고 순위를 매긴다고 할 때, 중복된 값들의 순위를 묶어(여기에서는 [2, 3, 4]) 그룹)

average: (default) 그룹의 평균으로 순위를 부여 -> [1, 3, 3, 3, 5]
min: 그룹의 최솟값으로 순위를 부여 -> [1, 2, 2, 2, 5]
max: 그룹의 최댓값으로 순위를 부여 -> [1, 4, 4, 4, 5]
first: 값이 나타난 순서대로 순위를 부여 -> [1, 2, 3, 4, 5]
dense: ‘min’ 방법과 동일하지만, 순위가 항상 1씩 증가하도록 부여 -> [1, 2, 2, 2, 3]

ascending: 오름차순으로 순위 매길 것인지 여부를 정한다. 오름차순으로 순위를 매기고 싶다면 True(default), 내림차순으로 순위를 매기고 싶다면 False라고 지정한다.

 

 

50부터 100까지의 수 중 랜덤으로 20개를 뽑아내서 큰 수부터 랭킹을 매겨보자

import random

scores = random.sample(range(50, 101), 20)
ranks = [0 for i in range(20)]

for idx, sco1 in enumerate(scores):
    for sco2 in scores:
        if sco1 < sco2:
            ranks[idx] += 1

print(scores)
print(ranks)

for i, s in enumerate(scores):
    print(f'score:{s} \t rank:{ranks[i] + 1}')
[95, 88, 50, 69, 77, 56, 53, 74, 71, 100, 72, 75, 61, 57, 80, 76, 65, 51, 64, 66]
[1, 2, 19, 10, 4, 16, 17, 7, 9, 0, 8, 6, 14, 15, 3, 5, 12, 18, 13, 11]
score:95 	 rank:2
score:88 	 rank:3
score:50 	 rank:20
score:69 	 rank:11
score:77 	 rank:5
score:56 	 rank:17
score:53 	 rank:18
score:74 	 rank:8
score:71 	 rank:10
score:100 	 rank:1
score:72 	 rank:9
score:75 	 rank:7
score:61 	 rank:15
score:57 	 rank:16
score:80 	 rank:4
score:76 	 rank:6
score:65 	 rank:13
score:51 	 rank:19
score:64 	 rank:14
score:66 	 rank:12

 

 

 

 

학급 학생(20명)들의 중간고사와 기말고사 성적을 이용해서 각각의 순위를 구하고, 중간고사 대비 기말고사 순위 변화(편차)를 출력하는 프로그램을 만들어 보자.(시험 성적은 난수를 이용한다.)

import rankMod as rm
import random

midStuScos = random.sample(range(50, 101), 20)
endStuScos = random.sample(range(50, 101), 20)

rd = rm.RankDeviation(midStuScos, endStuScos)

rd.setMidRank()
print(f'midStuScos: {midStuScos}')
print(f'mid_rank: {rd.getMidRank()}')

rd.setEndRank()
print(f'endStuScos: {endStuScos}')
print(f'end_rank: {rd.getEndRank()}')

rd.printRankDeviation()
class RankDeviation:

    def __init__(self, mss, ess):
        self.midStuScos = mss
        self.endStuScos = ess
        self.midRanks = [0 for i in range(len(mss))]
        self.endRanks = [0 for i in range(len(mss))]
        self.rankDeviation = [0 for i in range(len(mss))]

    def setRank(self, ss, rs):
        for idx, sco1 in enumerate(ss):
            for sco2 in ss:
                if sco1 < sco2:
                    rs[idx] += 1

    def setMidRank(self):
        self.setRank(self.midStuScos, self.midRanks)

    def getMidRank(self):
        return self.midRanks

    def setEndRank(self):
        self.setRank(self.endStuScos, self.endRanks)

    def getEndRank(self):
        return self.endRanks

    def printRankDeviation(self):

        for idx, mRank in enumerate(self.midRanks):
            deviation = mRank - self.endRanks[idx]

            if deviation > 0:
                deviation = '↑' + str(abs(deviation))
            elif deviation < 0:
                deviation = '↓' + str(abs(deviation))
            else:
                deviation = '=' + str(abs(deviation))

            print(f'mid_rank: {mRank} \t end_rank: {self.endRanks[idx]} \t Deviation: {deviation}')
midStuScos: [82, 62, 74, 61, 54, 81, 90, 66, 84, 76, 75, 64, 93, 71, 94, 77, 55, 99, 96, 50]
mid_rank: [6, 15, 11, 16, 18, 7, 4, 13, 5, 9, 10, 14, 3, 12, 2, 8, 17, 0, 1, 19]
endStuScos: [61, 71, 63, 91, 93, 72, 66, 82, 54, 67, 84, 95, 52, 83, 53, 75, 70, 56, 69, 59]
end_rank: [14, 8, 13, 2, 1, 7, 12, 5, 17, 11, 3, 0, 19, 4, 18, 6, 9, 16, 10, 15]
mid_rank: 6 	 end_rank: 14 	 Deviation: ↓8
mid_rank: 15 	 end_rank: 8 	 Deviation: ↑7
mid_rank: 11 	 end_rank: 13 	 Deviation: ↓2
mid_rank: 16 	 end_rank: 2 	 Deviation: ↑14
mid_rank: 18 	 end_rank: 1 	 Deviation: ↑17
mid_rank: 7 	 end_rank: 7 	 Deviation: =0
mid_rank: 4 	 end_rank: 12 	 Deviation: ↓8
mid_rank: 13 	 end_rank: 5 	 Deviation: ↑8
mid_rank: 5 	 end_rank: 17 	 Deviation: ↓12
mid_rank: 9 	 end_rank: 11 	 Deviation: ↓2
mid_rank: 10 	 end_rank: 3 	 Deviation: ↑7
mid_rank: 14 	 end_rank: 0 	 Deviation: ↑14
mid_rank: 3 	 end_rank: 19 	 Deviation: ↓16
mid_rank: 12 	 end_rank: 4 	 Deviation: ↑8
mid_rank: 2 	 end_rank: 18 	 Deviation: ↓16
mid_rank: 8 	 end_rank: 6 	 Deviation: ↑2
mid_rank: 17 	 end_rank: 9 	 Deviation: ↑8
mid_rank: 0 	 end_rank: 16 	 Deviation: ↓16
mid_rank: 1 	 end_rank: 10 	 Deviation: ↓9
mid_rank: 19 	 end_rank: 15 	 Deviation: ↑4
Comments