搜索

首页  >  问答  >  正文

python - Top K Frequent Elements?

[('d', 100), ('c', 99), ('a', 89), ('b', 86)]如何快速得出['d','c','a','b']

arr1 = [('d', 100), ('c', 99), ('a', 89), ('b', 86)]
arr2 = []
for key in range(len(arr)):
    arr2.append(arr[key][0])

感觉好low,有什么好的办法吗?
其实在用Python中在刷leetcode来学习
题目:https://leetcode.com/problems/top-k-frequent-elements/

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        items = {}
        for item in nums:
            if items.has_key(item):
                items[item]+=1
            else:
                items[item]=1
        arr1 = sorted(items.iteritems(), key=lambda asd:asd[1], reverse=True)
        arr2 = []
        for key in range(len(arr1)):
            arr2.append(arr1[key][0])
        return arr2[0:k]
阿神阿神2890 天前441

全部回复(1)我来回复

  • 怪我咯

    怪我咯2017-04-17 17:45:28

    很简单,使用 list comprehension 即可:

    arr1 = [('d', 100), ('c', 99), ('a', 89), ('b', 86)]
    arr2 = [pair[0] for pair in arr1]
    

    看了一下你原本的问题,写了一个简洁的版本,可以参考一下:
    (适用于 Python2.7+, Python3)

    from collections import Counter
    
    def top_k_frequent(lst, k):
        return [key for key, count in Counter(lst).most_common(k)]
    

    使用:

    lst = [1, 1, 1, 2, 3, 4, 4]
    print(top_k_frequent(lst, 2))
    

    效果:

    [1, 4]
    

    说明:

    Python2.7+之后的版本,在 collections 库里有一种类 Counter 可以用。 collections 庫裡有一種類 Counter 可以用。
    詳細的操作方法請參考Counter object

    利用 Counter(lst) 可以輕鬆得到一個 Counter實例,裡面已經對 lst 中的元素作過統計了。
    之後利用 most_common(k) 方法可以輕鬆得到一個排序過的 list of tuple,而且只會剩下前出現頻率前k高的項目,最後用 list comprehension详细的操作方法请参考Counter object

    🎜利用 Counter(lst) 可以轻松得到一个 Counter实例,里面已经对 lst 中的元素作过统计了。 🎜之后利用most_common(k) 方法可以轻松得到一个排序过的list of tuple,而且只会剩下前出现频率前k高的项目,最后用list comprehension 取出元素本身:🎜
    $>> from collections import Counter
    $>> counter = Counter([1, 1, 1, 2, 3, 4, 4])
    $>> counter
    Counter({1: 3, 4: 2, 2: 1, 3: 1})
    $>> most_items = counter.most_common(2)
    $>> most_items
    [(1, 3), (4, 2)]
    $>> [key for key, count in most_items]
    [1, 4]
    

    回复
    0
  • 取消回复