[英]How to write a function that takes a dictionary and prints the entries of the dictionary in alphabetical order?
[英]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}
現在我需要:
我應該將此字典轉換為元組還是列表?
這是一條線的答案
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.