假设我有这样的代码:
counter = Counter()
text = f.read()
words = words_generator(text)
interesting_words = filter_generator(words)
counter.update(interesting_words)
for i in counter:
print("Frequency for "+i ": "+counter[i]/sum)
我应该如何最好地设置 sum 的值,即 words_generator 产生的值的数量?
请您参考如下方法:
from collections import Counter
class CountItemsWrapper:
def __init__(self, items):
self.items = iter(items)
self.count = 0
def __next__(self):
res = next(self.items)
self.count += 1
return res
def __iter__(self):
return self
counter = Counter()
text = f.read()
words = CountItemsWrapper(words_generator(text))
interesting_words = filter_generator(words)
counter.update(interesting_words)
for i in counter:
print("Frequency for "+i ": "+counter[i]/words.count)
基本上,CountItemsWrapper 是一个迭代器,它只传递值,但会在传递时保持计数。
然后您可以只使用包装器上的 count 属性作为您的 sum。
类的解释:
def __init__(self, items):
self.items = iter(items)
self.count = 0
这很简单。请记住,实例是迭代器,而不仅仅是可迭代对象。所以这会迭代一次,保持计数一次。
def __next__(self):
res = next(self.items)
self.count += 1
return res
调用此方法是为了获取下一项。self.count 必须添加到 after 调用 next 因为我们允许 StopIteration如果我们没有产生值,则传播并且不想添加到计数中。
def __iter__(self):
return self
这是一个迭代器,所以它返回自己。
