Ray*_*Yee 9 python iterator python-itertools
我正在寻找一种"浏览"Python迭代器的方法.也就是说,我想将一个给定的迭代器iter和page_size与另一个迭代器包装起来,该迭代器将把它作为一系列"页面"从iter返回.每个页面本身都是一个迭代器,最多包含page_size迭代.
我查看了itertools,我看到的最接近的是itertools.islice.在某些方面,我想要的是与itertools.chain相反- 而不是将一系列迭代器链接到一个迭代器中,我想将迭代器分解为一系列较小的迭代器.我期待在itertools中找到一个分页功能,但找不到.
我想出了以下的传呼器类和演示.
class pager(object):
"""
takes the iterable iter and page_size to create an iterator that "pages through" iter. That is, pager returns a series of page iterators,
each returning up to page_size items from iter.
"""
def __init__(self,iter, page_size):
self.iter = iter
self.page_size = page_size
def __iter__(self):
return self
def next(self):
# if self.iter has not been exhausted, return the next slice
# I'm using a technique from
# https://stackoverflow.com/questions/1264319/need-to-add-an-element-at-the-start-of-an-iterator-in-python
# to check for iterator completion by cloning self.iter into 3 copies:
# 1) self.iter gets advanced to the next page
# 2) peek is used to check on whether self.iter is done
# 3) iter_for_return is to create an independent page of the iterator to be used by caller of pager
self.iter, peek, iter_for_return = itertools.tee(self.iter, 3)
try:
next_v = next(peek)
except StopIteration: # catch the exception and then raise it
raise StopIteration
else:
# consume the page from the iterator so that the next page is up in the next iteration
# is there a better way to do this?
#
for i in itertools.islice(self.iter,self.page_size): pass
return itertools.islice(iter_for_return,self.page_size)
iterator_size = 10
page_size = 3
my_pager = pager(xrange(iterator_size),page_size)
# skip a page, then print out rest, and then show the first page
page1 = my_pager.next()
for page in my_pager:
for i in page:
print i
print "----"
print "skipped first page: " , list(page1)
Run Code Online (Sandbox Code Playgroud)
我正在寻找一些反馈并提出以下问题:
谢谢!-Raymond
你为什么不使用这个?
def grouper( page_size, iterable ):
page= []
for item in iterable:
page.append( item )
if len(page) == page_size:
yield page
page= []
yield page
Run Code Online (Sandbox Code Playgroud)
“每个页面本身就是一个迭代器,最多包含 page_size”项。每个页面都是一个简单的项目列表,它是可迭代的。您可以使用yield iter(page)生成迭代器而不是对象,但我不知道这如何改进任何东西。
StopIteration它最后提出了一个标准。
你还想要什么?
| 归档时间: |
|
| 查看次数: |
2538 次 |
| 最近记录: |