我正在尝试从以下程序中获取已排序的输出。
"""Count words."""
# TODO: Count the number of occurences of each word in s
# TODO: Sort the occurences in descending order (alphabetically in case of ties)
# TODO: Return the top n words as a list of tuples
from operator import itemgetter
def count_words(s, n):
"""Return the n most frequently occuring words in s."""
t1=[]
t2=[]
temp={}
top_n={}
words=s.split()
for word in words:
if word not in temp:
t1.append(word)
temp[word]=1
else:
temp[word]+=1
top_n=sorted(temp.items(), key=itemgetter(1,0),reverse=True)
print top_n
return
def test_run():
"""Test count_words() with some inputs."""
count_words("cat bat mat cat bat cat", 3)
count_words("betty bought a bit of butter but the butter was bitter", 3)
if __name__ == '__main__':
test_run()
此程序输出如下:
[('cat', 3), ('bat', 2), ('mat', 1)]
[('butter', 2), ('was', 1), ('the', 1), ('of', 1), ('but', 1), ('bought', 1), ('bitter', 1), ('bit', 1), ('betty', 1), ('a', 1)]
但我需要的形式如下:
[('cat', 3), ('bat', 2), ('mat', 1)]
[('butter', 2), ('a', 1),('betty', 1),('bit', 1),('bitter', 1) ... rest of them here]
请你告诉我最好的方法吗?
答案 0 :(得分:3)
您需要更改key
给予sorted
的功能,因为您需要的输出中的项目需要按计数降序排序,但按字母顺序按升序排序。我使用lambda
函数:
top_n = sorted(temp.items(), key=lambda item: (-item[1], item[0]))
通过否定计数,升序排序可以获得所需的顺序。
答案 1 :(得分:0)
您可以更改:
top_n=sorted(temp.items(), key=itemgetter(1,0),reverse=True)
要:
temp2=sorted(temp.items(), key=itemgetter(0),reverse=False)
top_n=sorted(temp2.items(), key=itemgetter(1),reverse=True)
感谢Sort Stability你会很好
答案 2 :(得分:0)
而不是itemgetter
,请使用lambda t:(-t[1],t[0])
并删除reverse=True
:
top_n=sorted(temp.items(), key=lambda t:(-t[1],t[0]))
返回与itemgetter(1,0)
相同的内容,只有第一个值被反转,以便在较低的数字之前对较高的数字进行排序。
答案 3 :(得分:0)
def count_words(s, n):
"""Return the n most frequently occuring words in s."""
t1=[]
t2=[]
temp={}
top_n={}
words=s.split()
for word in words:
if word not in temp:
t1.append(word)
temp[word]=1
else:
temp[word]+=1
top_n=sorted(temp.items(), key=lambda t: (t[1], t[0]),reverse=True)
print top_n
return
def test_run():
"""Test count_words() with some inputs."""
count_words("cat bat mat cat bat cat", 3)
count_words("betty bought a bit of butter but the butter was bitter", 3)
if __name__ == '__main__':
test_run()
我使用了lambda
而不是itemgetter,而在我写过的其他应用中,lambda似乎有效。