【发布时间】:2018-08-19 14:49:16
【问题描述】:
我需要编写一个函数duplicate(it),它返回迭代器复制可迭代it 的元素。示例:如果 it = [1, 2, 3] 则 list(duplicate(it)) == [1, 1, 2, 2, 3, 3]。我尝试为列表实现DoubleIterator 类和duplicate(it) 函数(在这种情况下不确定DoubleIterator 的正确实现方式,所以欢迎提供有用的建议):
class DoubleIterator():
def __init__(self, data):
self.data = data
self.pos = 0
self.limit = len(data)
self.dup = 0
def next(self): # __next__ for Python 3
if self.dup != 0 and self.dup % 2 == 0:
self.pos = self.pos + 1
if self.pos < self.limit:
self.dup += 1
return self.data[self.pos]
else:
raise StopIteration
def __iter__(self):
return self
def duplicate(it):
itr = DoubleIterator(it)
return iter(itr)
它适用于 list(duplicate(it)) == [1, 1, 2, 2, 3, 3] 示例和类似的东西:
dup = duplicate([1, 2, 3])
print next(dup) #1
print next(dup) #1
print next(dup) #2
print next(dup) #2
print next(dup) #3
print next(dup) #3
但是这个函数的任务测试之一是dup = duplicate(iter([1, 2, 3])),它给出了一个错误:TypeError: object of type 'listiterator' has no len()。我应该如何正确实现duplicate函数和迭代器类?
【问题讨论】:
-
你为什么还要关心这里的
limit或按索引访问元素?对于self.data中的每个元素,只需多次生成它 - 你不需要知道/关心它的长度,或者即使它有一个......