Skip to main content
 首页 » 编程设计

python之确定生成器产生的值的数量

2025年05月04日17leader

假设我有这样的代码:

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 

这是一个迭代器,所以它返回自己。