nums는 숫자로 이루어진 배열입니다.
가장 자주 등장한 숫자를 k 개수만큼 return 해주세요.
def top_k(nums, k):
dic={}
a = []
for i in set(nums):
dic[i] = nums.count(i)
dic_sort = sorted(dic.items(), key=lambda x: x[1], reverse=True)
for j,k in dic_sort[:k]:
a.append(j)
return a
빈 딕셔너리와 리스트를 준비하고, 전달받은 리스트를 세트로 변환해 각각의 갯수를 {숫자 : '해당숫자갯수'}로 딕셔너리에 저장한다. 그후 밸류 값을 기준으로 내림차순으로 정렬하기 위해 sorted와 lambda로 정렬해줬다.
솔티드 함수의 첫번째 매개변수는 반복가능한(iterable)한 데이터 이어야 한다. 그럼 이 데이터를 새로운 정렬 리스트로 만들어서 반환해 준다. 여기서는 dic.items()로 키와 밸류값을 가져와 정렬하겠다는 말이다.
key 옵션(key 파라미터)은 어떤것을 기준으로 정렬할 것인지를 정한다. key 값을 기준으로 비교를 해 정렬 하겠다는 말이다. 여기서 사용한 lambda함수를 일반 함수로 표현하면 아래와 같다. x를 입력받으면 x의[1]즉, value값을 반환해준다.
def f1(x):
return x[1]
dic_sort = sorted(dic.items(), key=lambda x: x[1], reverse=True) 이렇게 사용하면 x의 [1] 즉 밸류값을 기준으로 정렬을하겠다는 말이다. 만약 여기 x[0]을 사용하면 키값을 기준으로 정렬하게 된다.
ex) a = {'apple':5, 'grape':10, 'banana':7, 'peach':3, 'melon':2} 이면 x의 x[0]은 'apple'이 될것이고 x의 x[1]은 5가 된다. 왜냐 list(a.items()) -> [('apple', 5), ('grape', 10), ('banana', 7)]이고 여기서 x[0] 과 x[1] 은 각각 키와 밸류를 의미한다.
마지막으로 reverse=True를 사용해 내림차순으로 정렬되게 했다.
그후 반환된 값을 반복문으로 리스트의 k번째 까지 반복하며 j,k를 꺼내는데 여기서 j는 키를 의미한다. 이값을 이전에 만들어 두었던 빈리스트 a 에 담아 리턴한다.
def top_k(nums, k):
return sorted(set(nums), key=nums.count, reverse=True)[:k]
역시 sorted함수이고 주어진 데이터를 세트로 변환한다. 그리고 그 세트를 정렬하는데 nums.count 즉 숫자의 갯수를 기준으로 정렬한다. 마찬가지로 reverse=True로 정렬하고 주어진 k까지 리턴해준다.