背景
全球三大MOOC网站之一的Udacity进入了中国市场,更名为优达学城,还给了一个月的免费学习时间!我一下瞄准了一门机器学习工程师的纳米学位,上之前,有几个测试的题目,其中有一个Python排序题还蛮有意思的:
在 Python 中实施函数“count_words()”,该函数将字符串“s”和数字“n”用作输入,并返回“s”中“n”个出现频率最高的单词。返回值应该是一个元组列表 - 出现频率最高的“n”个单词及其相应的出现次数“[(, ), (, ), …]”,按出现次数的降序排列。
您可以假设所有输入都是小写形式,并且不含标点符号或其他字符(只包含字母和单个分隔空格)。如果出现次数相同,则按字母顺序排列出现次数相同的单词。
例如:
print count_words("betty bought a bit of butter but the butter was bitter",3)
Output:
[('butter', 2), ('a', 1), ('betty', 1)]
思考过程
刚拿到手觉得应该很简单,只需要排序函数sorted()
就可以解决,结果发现这题需要两个条件,而且还是一个降序,一个升序。
myArray = sorted(myDict, key=itemgetter(1,0) )
myArray = sorted(myDict, key=itemgetter(1,0), reverse=True )
上面的就没有用了,google了一番之后终于找到了解决办法:
myArray = sorted(myDict.items(), key=lambda x: (-x[1],x[0]))
Python代码
下面给出完整的解决代码:
from operator import itemgetter
def count_words(s, n):
myDict = {}
myArray = []
for w in s.split():
myDict[w] = 0
for w in s.split():
myDict[w] +=1
myArray = sorted(myDict.items(), key=lambda x: (-x[1],x[0]))
return myArray[:n]
def test_run():
"""Test count_words() with some inputs."""
print count_words("cat bat mat cat bat cat", 3)
print count_words("betty bought a bit of butter but the butter was bitter", 3)
if __name__ == '__main__':
test_run()