任务: 频率分析仪。从txt文件中读取文本。在文本中输出一个单词一行的单词。单词必须按降序排序,如果某些单词具有相同的频率,则应按字典顺序排序。
在我的文本解析后的实现中,我们有一个对词典,例如('word',frequency),例如('hello',20)。所以问题是如何编写谓词以获得所需的结果。这是我的逻辑: 伪代码 按频率desc排序,直到得到相等的频率, 当相等的频率满足时,按词的词典顺序排序。 我的代码看起来像这样,但测试机输出“时间限制超过”,可能是因为排序两次。
wordlist = []
with open('words.txt','r') as f:
wordlist = [word for line in f for word in line.split()]
words = dict(zip(wordlist,[wordlist.count(p) for p in wordlist]))
dic = []
for key,val in words.items():
dic.append((key,val))
dic.sort(key=lambda a: (a[0]), reverse=False)
dic.sort(key=lambda a: (a[1]), reverse=True)
for word in dic:
print(word[0])
答案 0 :(得分:0)
由于元组的第二个元素是数字,您可以通过反转数字本身来反转排序的方向,这意味着您只需要使用适当的键进行一次排序。
dic.sort(key=lambda a: (-a[1], a[0]))
但是,sorted
的返回值直接使用words.items()
会稍微简单一些:
dic = sorted(words.items(), key=lambda a: (-a[1], a[0]))
如果您不能使用负数技巧,则必须编写显式比较函数并使用functools
模块将其转换为密钥。
def tup_compare(t1, t2):
w1, c1 = t1
w2, c2 = t2
if w1 < w2:
return 1
elif w1 > w2:
return -1
elif c1 < c2:
return -1
elif c1 == c2:
return 0
else:
return 1
dic = sorted(words.items, key=functools.cmp_to_key(tup_compare))