Python中的enumerate
假设我们有这样一个例子:
term='asdf'; InvertedIndex = {}; InvertedIndex[term] = [1,2,2,2,4,5,6,6,6,6,7]
。
现在我们有一个函数,它用来计算某个项目出现的次数。这个函数我遇到了一些问题。
def TF(term, doc):
idx = InvertedIndex[term].index(doc)
return next(i for i, item in enumerate(InvertedIndex[term][idx:])
if item != doc)
对于 TF(term, 1)
,它返回1;对于 TF(term, 2)
,返回3;对于 TF(term, 4)
,返回1。这些结果都没问题。
但是,当我调用 TF(term, 7)
时,它却给我抛出了StopIteration错误。如果我把 InvertedIndex[term] = [7]
,然后再调用 TF(term, 7)
,也会出现同样的错误。这个问题该怎么解决呢?
编辑:关于这个函数的目的做个说明。这个函数应该用来计算某个项目出现的次数。根据之前的例子,TF(term, 2)
应该返回3,因为在 InvertedIndex[term]
中它出现了3次。
解决方案:
def TF(term, doc):
return InvertedIndex[term].count(doc)
2 个回答
2
从语言的角度来看,你遇到的问题是你在一个序列上调用了'next',而当这个序列是空的时候,它会抛出一个StopIteration的错误。
除此之外,我们不太清楚怎么帮助你,因为你写的函数到底是想做什么并不明显。你可能需要一些像这样的东西:
def uniq_docs(inverted_index):
last = None
for i, doc in enumerate(inverted_index):
if doc != last:
yield i, doc
last = doc
而在你当前调用TF的地方,使用一些像这样的:
for index, doc in uniq_docs(InvertedIndex[term]):
...
3
我觉得我在另一个回答里写过那个循环,不过你想做的事情的正确方法是 InvertedIndex[term].count(doc)
这个方法会计算 doc
在列表中出现的次数。