来自LeetCode 692
看了题解,让我感到惊奇的不是解这道题的本身,而是排序的部分:
class Solution:
def topKFrequent(self, words: List[str], k: int) -> List[str]:
# 官方题解一,排序
words_collection = collections.Counter(words)
words_list = list(words_collection.keys())
words_list.sort(key=lambda x: (-1 * words_collection[x], x)) # look at here!
return words_list[0:k]
sort 的key参数后面跟着一个lambda表达式,返回一个元组,元组的第一个参数是负的出现频率,因为sort默认升序排序,而将出现频率的负数从小到大排序,顺序就相当于按照出现频率从大到小排序(越大的数字对应的负数越小嘛)。
而题目中“如果不同的单词有相同出现频率,按字母顺序排序”如何实现呢?就是元组的第二个参数,直接用words里头的元素进行排序,也就是按照字母的升序排序了。
最让我感到惊奇的是原来key的lamda表达式是可以返回元组的。暂时没有搜索到这么做的官方文档,按照我的理解,排序的优先级应该是从元组的第一个元素到最后一个元素,当按照前一个元素排序的结果一致时,看下一个元素进行排序。
看到一个说法,只有sort可以这么做,sorted不行