假设我想创建一个迭代器类,该类将另一个迭代器作为输入并计算元素的频率。我不能使用列表,字典或其他任何东西,因此我必须递归解决此问题-即通过创建嵌套迭代。从概念上讲,我希望我的课能做到以下几点:
for i in iter(input):
count=0
for j in iter(input):
if i=j:
count+=1
if j = None: #iterator is done
# reset j
# move to next element of i
这显然在许多方面都是一个简化的示例,但是我希望我的课程的总体结构清晰易懂。每次我将i的值和计数保存到磁盘时,我们现在都可以忽略它。
我遇到的第一个问题是Python不允许迭代器在被消耗后被重置,这会导致重置内部循环(j)产生问题。在启动第二个允许无限迭代的迭代器时,我使用itertools.cycle()
克服了这一问题。不幸的是,下面的代码仅对数据成功进行一次传递,并且第一个if语句不返回外部迭代器的下一个值,而是将其视为已被使用。
class Match:
def __init__(self, input):
'''
Input is an iterator
'''
self.in1 = input
self.in2 = input
self.c=0 #the count
def __iter__(self):
'''
Initializes the iterators and fetches the first element
'''
self.it1 = iter(self.in1) # initialize the first (outer) iterator
self.it2 = itertools.cycle(iter(self.in2)) # initialize the second (inner) iterator
self.i = next(self.it1) #pin the first elements
self.j = next(self.it2)
return self
def _inc_outter_end(self):
'''increment or end outer iterator'''
try:
self.i = next(self.it1)
except StopIteration:
self.i = None
self.j = None
def __next__(self):
i = self.i
j = self.j
self.j = next(self.it2)
self.c+=1
if self.c ==9:
self.c=0
self._inc_outter_end()
i = self.i
#stop if done
elif i == None:
raise StopIteration()
#skip non-pairs
elif i != j:
return self.__next__()
#count and return matches
elif i==j:
return self.c
正在运行类似:
i1 = [1,7,2,4,6,6,1,1,3]
for match in Match(iter(i1)):
print(match)
对数据进行一遍处理,使i始终为1,但停止了八遍处理(对于输入的所有下一个元素),而不是进行八遍处理。相反,我希望它返回与以下相同的输出:
i1 = [1,7,2,4,6,6,1,1,3]
for i in i1:
count=0
for j in i1:
if i==j:
count+=1
print(i,count)
给予
1 3
7 1
2 1
4 1
6 2
6 2
1 3
1 3
3 1
似乎,对于输入迭代器中的每个元素,您都希望发出entire迭代器产生该元素的次数。显然,在完全耗尽迭代器之前,您无法计算该数字。这就意味着,无论您想出什么解决方案,它都必须以某种方式存储有关迭代器元素的信息,以便同时存储有关所有元素的信息。但是,您也说
我不能使用列表,字典或其他任何东西[...]现在不清楚您的意思是什么(具体来说,“其他任何东西”到底指的是什么?),但是很自然地,这可能意味着您可以用来存储有关迭代器所有元素的信息。时间不限。如果您的情况如此,那么此任务是不可能的。您必须放松自己的限制之一,或者找到一种方法完全解决此问题。