Codekata: Week2 Day4

Seoyul Kim·2020년 7월 1일
0

Algorithm

목록 보기
2/4

✔️ Explanation

def top_k(nums, k):
  count_num  = []   [1]
  num = set(nums)   [2]
  for i in num:
    count_num.append([i,nums.count(i)])   [3]
  count_num.sort(key=lambda x:x[1], reverse=True)   [4] 

  return  [row[0] for row in count_num][:k]   [5]
  

[1] : count_num 이라는 빈 리스트를 생성한다.

[2] : nums를 set으로 중복을 제거한다.

[3] : num에 있는 요소마다 그 요소의 갯수를 nums에서 count 해서 요소와 함께 리스트로 묶어 count_num에 추가한다.

[4] : key 매개변수와 lambda식을 이용하여 2차원 리스트의 각 두번째 열를 기준으로 reverse=True 를 이용하여 큰 값부터 정렬한다.

[5] : 2차원 리스트의 첫번째 열만을 k 개수만큼 리스트로 return 한다.

➕ Additional Explanation

☑️ 비교할 요소가 여러 개인 경우 튜플로 순서를 정할 수 있다.

count_num.sort(key=lambda x : (x[0], -x[1]))

☑️ 다차원 리스트에서 특정 열을 선택하는 방법

list(map(lambda x : x[0], count_num))
  • count_num에서 첫번째 열을 선택하여 리스트로 묶는다.
list(list(zip(*count_num))[0])
print(count_num)
print(list(zip(*count_num)))

[[2, 2], [3, 2], [1, 1]]
[(2, 3, 1), (2, 2, 1)]
  • zip(*count_num) 으로 다차원 배열을 단일 배열 인수로 언패킹하고, 2차원 배열의 첫번째 요소끼리, 두번째 요소끼리 튜플로 묶어 리스트로 형 변환한 후 [0] 으로 첫번째 요소를 선택한다.

👉🏻 zip() 이란?

  • python의 내장 함수로 동일한 개수로 이루어진 자료형을 묶어주는 역할을 한다.
  • 행을 열로 pivot 해준다.
  • 각 열을 기준으로 값을 slice할 수 있다.
  • 2개의 배열의 하나의 배열로 언패킹 할 수 있다.
  • 변환된 값은 tuple의 형태를 갖고 있다.
  • list(), dict()등을 사용하여 형 변환하지 않을시 에러가 발생한다.

0개의 댓글