使用带有生成器类的itertools

时间:2014-10-20 23:08:07

标签: python

我正在尝试编写一个从程序读入的文件中生成单词的类。我坚持使用__iter__next方法。我的想法显然是在__init__中阅读文件,但我对如何迭代它感到困惑,因为我知道itertools会做类似的事情。有什么建议吗?

目前我有这段代码。

def __init__(self):
    self.words = []
    self.n = 0
    with open('words.txt') as f:
        text = f.read()
    for x in text.split():
        if len(x) > 2 and x[0].islower():
            self.words.append(x)

def __iter__(self):
    return self


def next(self):
    if(self.n == 0):
        self.n = self.n + 1
        return self.words[0]
    else:
        self.n = self.n + 1
        return self.words[self.n-1]

这就是代码的运行方式。

>>> mw = MerriamWebster()
>>> [w for w in itertools.islice(mw, 5)]
['aal', 'aalii', 'aam', 'aardvark', 'aardwolf']

2 个答案:

答案 0 :(得分:0)

在这种情况下,__iter__方法需要返回一个跟踪它位置的对象。

如果__iter__返回self,您可以在实例变量中跟踪此位置,但它混合了两个职责,这意味着您不能在对象上拥有两个(或更多)独立迭代器。但在某些情况下它可能有意义。

看起来你真的只想要一个发电机

def MerriamWebster(fname='words.txt'):
    with open(fname) as f:
        for x in f:
            if len(x) >= 2:
                yield x

答案 1 :(得分:0)

如果你希望迭代你的对象只是单词成员,为什么不这样做:

def __iter__(self):
    return iter(self.words)

并将索引跟踪委托给列表迭代器。