我的任务是:
打印出语料库中出现的所有单词及其频率的列表。此列表应按字降序排列(最常见的字首先)。"
def printWordFrequencies(index, vocab):
#print("Your task 3: print out a list of all the words that occur in the corpus and their frequencies. This list should be sorted by word frequencies in descending order (most frequent word first).")
newList = []
for i in index:
newList.append([i, len(index[i])])
sorted(newList)
return newList
index
是一个字典(关联数组),用于将单词映射到其位置列表,vocab
是按字母顺序排列的语料库中使用的词汇表。
我写的函数有两个问题。首先,它没有正确排序。它给出正确的单词频率,如[.., ['plot', 128], ['two', 166] , ..]
,但不会根据频率进行排序。
其次,运行时间太长。我假设这是因为它试图追加并排序这么长的列表,但我不知道如何解决这个问题。
一件小事是,我不确定为什么我需要vocab
作为输入参数。
答案 0 :(得分:1)
首先,您最后只需要对newList
进行一次排序。目前,您正在为循环的每次迭代对其进行排序,这就是它运行速度如此之慢的原因。使用sorted()
也不会更改原始列表,但会返回一个新的排序列表,因此在您的代码中,排序不起作用,因为您没有存储返回的列表。
其次,要根据每个条目中的第二项进行排序,您可以sorted()
使用key
。在这种情况下,它首先根据第二个长度项x[1]
进行排序,如果两个条目的长度相同,则根据第一个条目x[0]
进行排序。
def printWordFrequencies(index, vocab):
newList = []
for i in index:
newList.append([i, len(index[i])])
return sorted(newList, key=lambda x: [x[1], x[0]], reverse=True)
使用列表理解可以进一步简化:
def printWordFrequencies(index, vocab):
return sorted([i, len(index[i])]] for i in index, key=lambda x: [x[1], x[0]], reverse=True)
答案 1 :(得分:0)
您不需要为在newList中添加的每个单词对新列表进行排序,因此从for循环中排除已排序的方法。
如果我理解你需要检查索引中的单词是否也在词汇中。
您可以尝试这样的事情:
def printWordFrequencies(index, vocab):
newList = []
for i in index:
if i in vocab:
newList.append([i, len(index[i])])
sorted(newList, key=lambda k: [k[1], k[0]])
return newList
按第一个键的顺序排列第二个值,如果首先是相同的长度。
希望它有所帮助。