Python:Code Taka第2週4


Q.numsは数字からなる配列です。最もよく現れる数字をk個返してください。

nums = [1,1,1,2,2,3],
k = 2

return [1,2]

nums = [1]
k = 1

return [1]

私の答え

from collections import Counter
def top_k(nums, k):
  cnt = Counter(nums)
  top = cnt.most_common()
  result = []
  for n in range(k):
      result.append(top[n][0])
  
  return result
  • セットのCounterクラスを使用class collections.Counter([iterable-or-mapping])
  • カウンタ(nums)を使用してカウンタオブジェクトを返します.
  • Counterクラスのメソッドmost common()を使用すると、最大何回まで現れる値のtupleが返されます.
  • [1,1,1,2,3]リストをパラメータとしてCounterに付与して戻り値を受け入れると、
    カウンタ({1:3,2:2,3:1})は
  • を返します.
  • most commonメソッドの使用
    [(1,3),(2,2),(3,1)]は
  • を返します.
  • で最も多くの値が表示されるように、ソートされたメタグループリストはkを繰り返し、必要な数を抽出する.
    答えはリストしたい形式なのでresultというリストに値を追加しました.
  • もう少し簡単に直した答え

    from collections import Counter
    
    def top_k(nums, k):
      cnt = Counter(nums)
      top = cnt.most_common(k)
      return list(map(lambda x: x[0], top))

    ソリューション

    def top_k(nums, k):
        count = {}
        for n in nums:
            count[n] = count.get(n, 0) + 1
            
        bucket = [[] for _ in range(len(nums)+1)]
        
        for n, freq in count.items():
            bucket[freq].append(n)
            
        ret = []
        for n_list in bucket[::-1]:
            if n_list:
                ret.extend(n_list)
                if len(ret) == k:
                    return ret
    (ソリューションを分析中...)