簡體   English   中英

如何編寫一個 function 接受一個字符串並按頻率降序打印字母?

[英]How to write a function that takes a string and prints the letters in decreasing order of frequency?

我做到了這一點:

def most_frequent(string):
    d = dict()
    for key in string:
        if key not in d:
            d[key] = 1
        else:
            d[key] += 1
    return d

print most_frequent('aabbbc')

返回:

{'a': 2, 'c': 1, 'b': 3}

現在我需要:

  1. 反轉對
  2. 按數字降序排序
  3. 只打印字母

我應該將此字典轉換為元組還是列表?

這是一條線的答案

sortedLetters = sorted(d.iteritems(), key=lambda (k,v): (v,k))

這應該做得很好。

def frequency_analysis(string):
    d = dict()
    for key in string:
        d[key] = d.get(key, 0) + 1
    return d

def letters_in_order_of_frequency(string):
    frequencies = frequency_analysis(string)
    # frequencies is of bounded size because number of letters is bounded by the dictionary, not the input size 
    frequency_list = [(freq, letter) for (letter, freq) in frequencies.iteritems()]
    frequency_list.sort(reverse=True)
    return [letter for freq, letter in frequency_list]

string = 'aabbbc'
print letters_in_order_of_frequency(string)

這是返回元組列表而不是字典的內容:

import operator

if __name__ == '__main__':

    test_string = 'cnaa'

    string_dict = dict()
    for letter in test_string:
        if letter not in string_dict:
            string_dict[letter] = test_string.count(letter)

    # Sort dictionary by values, credits go here http://stackoverflow.com/questions/613183/sort-a-dictionary-in-python-by-the-value/613218#613218
    ordered_answer = sorted(string_dict.items(), key=operator.itemgetter(1), reverse=True)
    print ordered_answer

Python 2.7 直接支持這個用例:

>>> from collections import Counter
>>> Counter('abracadabra').most_common()
[('a', 5), ('r', 2), ('b', 2), ('c', 1), ('d', 1)]

chills42 lambda function 獲勝,我認為,但作為替代方案,如何生成以計數作為鍵的字典呢?

def count_chars(string):
    distinct = set(string)
    dictionary = {}
    for s in distinct:
        num = len(string.split(s)) - 1
        dictionary[num] = s
    return dictionary

def print_dict_in_reverse_order(d):
    _list = d.keys()
    _list.sort()
    _list.reverse()
    for s in _list:
        print d[s]

編輯這將做你想要的。 我正在竊取chills42行並添加另一個:

sortedLetters = sorted(d.iteritems(), key=lambda (k,v): (v,k))
sortedString = ''.join([c[0] for c in reversed(sortedLetters)])

------------原始答案------------

要打印出排序后的字符串,請在chills42 one-liner 中添加另一行:

''.join(map(lambda c: str(c[0]*c[1]), reversed(sortedLetters)))

這打印出'bbbaac'

如果你想要單個字母,'bac' 使用這個:

''.join([c[0] for c in reversed(sortedLetters)])
from collections import defaultdict

def most_frequent(s):
    d = defaultdict(int)
    for c in s:
        d[c] += 1

    return "".join([
        k for k, v in sorted(
        d.iteritems(), reverse=True, key=lambda (k, v): v)
    ])

編輯:

這是我的一個班輪:

def most_frequent(s):
    return "".join([
        c for frequency, c in sorted(
            [(s.count(c), c) for c in set(s)], reverse=True
        )
    ])

這是您最頻繁的most_frequent的代碼:

>>> a = 'aabbbc'
>>> {i: a.count(i) for i in set(a)}
{'a': 2, 'c': 1, 'b': 3}

這種特殊的語法適用於 py3k,但使用以前版本的語法很容易編寫類似的東西。 在我看來,它比你的更具可讀性。

def reversedSortedFrequency(string)
   from collections import defaultdict
   d = defaultdict(int)
   for c in string:
     d[c]+=1
   return sorted([(v,k) for k,v in d.items()], key=lambda (k,v): -k)

這是固定版本(感謝您指出錯誤)

def frequency(s):
    return ''.join(
        [k for k, v in
        sorted(
            reduce(
                lambda d, c: d.update([[c, d.get(c, 0) + 1]]) or d, 
                list(s), 
                dict()).items(),
            lambda a, b: cmp(a[1], b[1]),
            reverse=True)])

我認為與其他解決方案相比, reduce的使用使這個解決方案有所不同......

在行動:

>>> from frequency import frequency
>>> frequency('abbbccddddxxxyyyyyz')
'ydbxcaz'

也包括提取密鑰(並計算它們) :!! 另一個不錯的屬性是在同一行上初始化字典:)

另外:沒有包含,只有內置。

reduce function 有點難以理解,並且在 lambda 中設置字典值在lambda中也有點麻煩,但是,嗯,很好!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM