【问题标题】:enumerate in python在python中枚举
【发布时间】:2011-05-03 00:34:53
【问题描述】:

说,

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)

【问题讨论】:

  • 我认为你应该使用collections.Counter
  • 如果您在 python >= 2.7 上并且想要计算每个项目,那么计数器很好

标签: python


【解决方案1】:

我觉得我在另一个答案上写了那个循环,但你想要做的正确答案是InvertedIndex[term].count(doc)

这将计算doc 在列表中出现的次数。

【讨论】:

  • 该死!我不知道有一个 count() 方法。还小更正其InvertedIndex[term].count(doc)
  • 这就是为什么我应该在开始为项目编码之前花足够的时间学习语言。
  • @claws,我确实写了那个函数。很抱歉其中的愚蠢错误。每当我尝试编写一些稍微有点棘手的东西而不对其进行测试时,都会发生这种情况(尽管我正在变得更好)。显然,当我第一次编写 count 方法时,我也没有考虑它。我已经更新了对原始问题的回答。
【解决方案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]):
    ...

【讨论】:

  • 抱歉,不清楚该函数的目的。该功能应该算不上。项的发生次数。考虑到使用的示例TF(term, 2) 必须返回 3,因为它在 InvertedIndex[term] 中出现了 3 次
猜你喜欢
  • 2015-08-08
  • 2021-05-25
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2013-08-26
  • 2013-10-01
  • 2012-12-05
相关资源
最近更新 更多