Python中的enumerate

4 投票
2 回答
2229 浏览
提问于 2025-04-16 06:20

假设我们有这样一个例子:

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 在列表中出现的次数。

撰写回答