Zigzag Iterator的Pythonic方式?

Zigzag Iterator的Pythonic方式?,第1张

概述我正在编写Zigzag Iterator,它是以下列方式迭代2D列表: [1,4,7][2,5,8,9][3,6] 至 [1,2,3,4,5,6,7,8,9] 我实现了一个算法: class ZigzagIterator: def __init__(self, vecs): self.vecs = [] self.turns = 0 我正在编写zigzag Iterator,它是以下列方式迭代2D列表:

[1,4,7][2,5,8,9][3,6]

[1,2,3,6,7,9]

我实现了一个算法:

class zigzagIterator:    def __init__(self,vecs):        self.vecs = []        self.turns = 0        for vec in vecs:            vec and self.vecs.append(iter(vec))    def next(self):        try:            elem = self.vecs[self.turns].next()            self.turns = (self.turns+1) % len(self.vecs)            return elem        except stopiteration:            self.vecs.pop(self.turns)            if self.hasNext():                self.turns %= len(self.vecs)    def hasNext(self):        return len(self.vecs) > 0if __name__ == "__main__":    s = zigzagIterator([[1,7],[2,9],[3,6]])    while s.hasNext():        print s.next()>>> 1 2 3 4 5 6 7 8 None None 9 None

我知道问题是因为我再次调用每个列表的next(),然后我得到3无.我可以通过使用java检查hasnext方法来解决此问题.我也可以在python中实现一个hasnext Iterator.我的问题是如何以更加pythonic的方式解决这个问题,而不是用Java思考它.

解决方法 这是 itertools docs中的循环配方.

def roundrobin(*iterables):    "roundrobin('ABC','D','EF') --> A D E B F C"    # Recipe credited to George Sakkis    num_active = len(iterables)    nexts = cycle(iter(it).__next__ for it in iterables)    while num_active:        try:            for next in nexts:                yIEld next()        except stopiteration:            # Remove the iterator we just exhausted from the cycle.            num_active -= 1            nexts = cycle(islice(nexts,num_active))
总结

以上是内存溢出为你收集整理的Zigzag Iterator的Pythonic方式?全部内容,希望文章能够帮你解决Zigzag Iterator的Pythonic方式?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1192111.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存