1. 程式人生 > >451. 根據字元出現頻率排序(中等,字串)(12.23)

451. 根據字元出現頻率排序(中等,字串)(12.23)

 給定一個字串,請將字串裡的字元按照出現的頻率降序排列。

示例 1:

輸入:
"tree"

輸出:
"eert"

解釋:
'e'出現兩次,'r'和't'都只出現一次。
因此'e'必須出現在'r'和't'之前。此外,"eetr"也是一個有效的答案。
class Solution(object):
    def frequencySort(self, s):
        """
        :type s: str
        :rtype: str
        """
        d = {}
        for i in range(len(s)):
            if s[i] in d:
                d[s[i]] += 1
            else:
                d[s[i]] = 1
        list1 = zip(d.values(),d.keys())
        list1.sort(reverse=True)
        res = ""
        for i in range(len(list1)):
            res += list1[i][1]*list1[i][0]
        return res
        

執行用時: 52 ms, 在Sort Characters By Frequency的Python提交中擊敗了81.58% 的使用者 

class Solution(object):
    def frequencySort(self, s):
        """
        :type s: str
        :rtype: str
        """
        from collections import Counter
        count=collections.Counter(s).most_common()
        res=''
        for c,v in count:
            res+=c*v
        return res

Counter 集成於 dict 類,因此也可以使用字典的方法,此類返回一個以元素為 key 、元素個數為 value 的 Counter 物件集合

>>> from collections import Counter
>>> s = "hello pinsily"
>>> d = Counter(s)
>>> d
Counter({'l': 3, 'i': 2, 'h': 1, 'e': 1, 'o': 1, ' ': 1, 'p': 1, 'n': 1, 's': 1, 'y': 1})
elements()
返回一個迭代器

>>> d.elements()
<itertools.chain object at 0x0000019AC812BBA8>

# 可以進行列印和排序
>>> for i in d.elements():
...     	print(i)
...


most_common(n)
返回數量最多的前 n 個元素

>>> d.most_common(3)
[('l', 3), ('i', 2), ('h', 1)]
subtract([iterable-or-mapping])
相當於減法,呼叫這個方法的 Counter 會被覆蓋掉

>>> c = Counter(a=4, b=2, c=0, d=-2)
>>> d = Counter(a=1, b=2, c=3, d=4)
>>> c.subtract(d)
>>> c
Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})
>>> d
Counter({'d': 4, 'c': 3, 'b': 2, 'a': 1})