Python多条件排序

背景

全球三大MOOC网站之一的Udacity进入了中国市场,更名为优达学城,还给了一个月的免费学习时间!我一下瞄准了一门机器学习工程师的纳米学位,上之前,有几个测试的题目,其中有一个Python排序题还蛮有意思的:

统计 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()