如何重置遍历集合的循环?

时间:2019-02-25 15:54:49

标签: python python-3.x python-2.7 loops set

如何重置在集合上迭代的循环?遍历列表的一个常见答案是重置用于访问列表的索引,但是集合不支持索引。

关键是要能够迭代大量对象,对每个元素执行一些操作,直到结果与我需要的结果匹配为止。我要搜索的功能是重置循环的功能。意思是从头开始重新进行迭代,以确保无论出于何种原因我都能再次访问每个元素。

如何重置以下循环?

for element in some_set:
   print element
   if element + offset == needed_result:
      # reset

针对此特定问题,我使用python 2.7,但我也欢迎python 3解决方案。

3 个答案:

答案 0 :(得分:1)

一种方法是使用iterators。您可以通过简单地在集合上调用next并在每次迭代中调用其s = {1,2,3,4,5} s_ = iter(s) # Just a counter to avoid endless loop cont = 0 while cont < 10: try: i = next(s_) except StopIteration: break # Some condition if flag == True: # Reset the iterator when the condition is met s_ = iter(s) continue cont += 1 方法来定义迭代器。满足条件后,您可以简单地从集合中再次创建迭代器对象,然后重复该过程:

book$

答案 1 :(得分:0)

我只是将集合转换为列表并使用while循环:

sett = {'a','b','c','d','e','f','g','h'}
lisst = list(set)

position = 0
while (position <= 8):
   element = lisst[position]
   print element
   if element + offset == needed_result:
        position = 0
   else:
        position += 1

答案 2 :(得分:0)

这是一个巧妙的技巧,它可以采用任何一种可迭代的(包括集合),并返回ReIterable类的实例(我们为“可重置的可迭代”的简称)。

然后,我们可以在for循环中将可重复使用作为for r in my_reiterable,就像在for i in my_iterable中使用原始可重复使用一样。

for循环中,只要条件合适就可以重新设置循环,我们只需要在可重复迭代器上调用reset()方法。< / p>

这是一个使用s集的示例用法(但也可能是列表或任何其他可迭代的):

s = {'a', 'b', 'c', 'd', 'e', 'f'}
r = ReIterable(s)
for i in r:
    print ('In for loop,', i)
    if (i == 'c'):
        resp = str(input('Found "c". Do you want to reset?(y/n):'))
        if (resp == 'y'):
            r.reset()

这是输出(请注意,第一次提示用户重置时,用户以y进行响应,导致该设置再次被遍历。第二次提示用户重置时,用户以n进行了响应,并且循环继续进行而没有重置):

In for loop, e
In for loop, c
Found "c". Do you want to reset?(y/n):y
In for loop, e
In for loop, c
Found "c". Do you want to reset?(y/n):n
In for loop, a
In for loop, d
In for loop, b
In for loop, f

这是如何工作的?包装器类ReIterable使用for循环和可迭代之间的协议。

这是ReIterable类的外观(但是,您只需要知道如何使用该类,如上所示):

class ReIterable:
    def __init__(self,original):
        self.original = original
        self.iterator = iter(original)
        self.reset_flag = False

    def __iter__(self):
        return self

    def __next__(self):
        if (self.reset_flag):
            print ('In __next__(), reset_flag True')
            self.iterator = iter(self.original)
            self.reset_flag = False
        return next(self.iterator)

    def reset(self):
        self.reset_flag = True

注意:

ReIterable类除了支持重置操作外,实际上还将所有迭代工作委托给原始的Iterable或其迭代器。实际的“重置”涉及将旧的迭代器添加到新的迭代器中(同样在@yatu的答案中)。