from collections import Counter
# collections의 Counter : 리스트를 딕셔너리로 만드는데 요소 개수의 '순서대로' 출력해 줌 : "따로 리버스 할 필요가 없었다."
def top_k(nums, k):
count = Counter(nums)
# 먼저 Counter로 nums를 개수의 순서대로 딕셔너리화 시킨다.
sub_list = []
# 딕셔너리의 키를 받을 서브 리스트를 만든다.(내가 필요한건 키지 값이 아님)
for K, V in count.most_common(k):
# for loop 로 값을 가져오는 과정.
# 여기서 쓰인 count.most_common(k) : 가장 최빈값 k번째까지 가져온다.
for j in range(V):
# 키값을 가져오려면 values도 같이 loop 해야 하므로 같이 돌려주고
sub_list.append(K)
# sublist에 필요한 K를 넣어준다. (여기서 k개까지만 이미 리스트화 된다.)
one_list = list(set(sub_list))
# 여러 값이 나온(value 갯수 순으로 222333..)나온 것을 세트+리스트로 다시 정리
result = []
for i in one_list[:k]:
result.append(i)
return result
# 이후 다시 k번째 값까지 구함. 이 때 리스트의 슬라이싱 이용
print(top_k([1,1,2,2,2,2,3,3,3], 2))
참고 링크
def top_k(nums, k):
nums.sort()
# 배열 정렬
to_dict = {i : nums.count(i) for i in nums}
# 개수 별로 리스트 -> 딕셔너리화(list comprehension)
new_dict = sorted(to_dict, key = lambda j : to_dict[j], reverse=True)
# 자주 등장, 즉 value값이 큰 순서대로 Key값을 정렬하기 위해 reverse를 사용
result = new_dict[:k]
# k까지 출력
return result
print(top_k([1,1,1,2,2,3], 2))