Python迭代器类-嵌套迭代

问题描述 投票:0回答:1

假设我想创建一个迭代器类,该类将另一个迭代器作为输入并计算元素的频率。我不能使用列表,字典或其他任何东西,因此我必须递归解决此问题-即通过创建嵌套迭代。从概念上讲,我希望我的课能做到以下几点:

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
python iterator itertools
1个回答
0
投票

似乎,对于输入迭代器中的每个元素,您都希望发出entire迭代器产生该元素的次数。显然,在完全耗尽迭代器之前,您无法计算该数字。这就意味着,无论您想出什么解决方案,它都必须以某种方式存储有关迭代器元素的信息,以便同时存储有关所有元素的信息。但是,您也说

我不能使用列表,字典或其他任何东西[...]

现在不清楚您的意思是什么(具体来说,“其他任何东西”到底指的是什么?),但是很自然地,这可能意味着您可以用来存储有关迭代器所有元素的信息。时间不限。如果您的情况如此,那么此任务是不可能的。您必须放松自己的限制之一,或者找到一种方法完全解决此问题。

© www.soinside.com 2019 - 2024. All rights reserved.