Python 如何重置在集合上迭代的循环?

Python 如何重置在集合上迭代的循环?,python,python-3.x,python-2.7,loops,set,Python,Python 3.x,Python 2.7,Loops,Set,如何重置在集合上迭代的循环?迭代列表的常见方法是重置用于访问列表的索引,但是集合不支持索引 关键是能够迭代一大组对象,对每个元素执行一些操作,直到结果与我需要的结果匹配。我正在搜索的功能是能够重置循环。这意味着从一开始就重新启动迭代,以确保出于任何原因再次访问每个元素 如何重置以下循环 for element in some_set: print element if element + offset == needed_result: # reset 我使用Pytho

如何重置在集合上迭代的循环?迭代列表的常见方法是重置用于访问列表的索引,但是集合不支持索引

关键是能够迭代一大组对象,对每个元素执行一些操作,直到结果与我需要的结果匹配。我正在搜索的功能是能够重置循环。这意味着从一开始就重新启动迭代,以确保出于任何原因再次访问每个元素

如何重置以下循环

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

我使用Python2.7解决这个特定问题,但我也欢迎Python3解决方案。

一种方法是使用。您可以通过对集合调用
iter()
来定义迭代器,并在每次迭代时调用其
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
s={1,2,3,4,5}
国际热核实验堆
#只是一个计数器,以避免无休止的循环
cont=0
当cont<10时:
尝试:
i=下一个(s)
除停止迭代外:
打破
#某些条件
如果flag==True:
#满足条件时重置迭代器
国际热核实验堆
持续
cont+=1

我只需将集合转换为列表并使用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
sett={'a','b','c','d','e','f','g','h'}
lisst=列表(集合)
位置=0

while(position这里有一个巧妙的技巧,它接受任何类型的iterable(包括集合),并返回一个
可重复的
类的实例(我们对“resetable iterable”的简称)

然后,我们可以将
for
循环中的re iterable用作
for r in my_reitable
,就像我们将
中的原始iterable用于my_iterable
中的i一样

for
循环中,只要条件适合重新设置循环,我们只需调用可重写的
reset()
方法

下面是一个使用set
s
的示例(但它也可以是一个列表或任何其他iterable):

以下是输出(请注意,第一次提示用户重置时,用户以
y
进行响应,导致集合再次重复。第二次提示用户重置时,用户以
n
进行响应,循环未重置):

这是如何工作的?包装类ReIterable利用了
for
循环和iterable之间的协议

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

注意:


除了支持重置操作外,
ReIterable
类本质上将所有迭代工作委托给原始iterable或其迭代器。实际的“重置”包括废弃旧迭代器并获取新迭代器(正如@yatu的答案所示)。

重置正在使用的索引-这在
for
循环中也不起作用。更广泛的背景是什么,你试图解决的问题?重置是什么意思?你从循环中创建
中断
,然后再次开始迭代,但为什么?集合是无序的你知道我希望你所说的
重置
是什么意思?这并不是说集合“耗尽”了,它将始终包含相同的元素,它是不可变的-并且与列表不同,它也是无序的。@jonrsharpe更广泛的上下文正是这样。我在一个无序的大列表上迭代,其中对于每个元素,我必须对值进行散列,并将其与某个值进行比较,直到找到与散列匹配的某个值,但这与此无关。我将I’我希望能够重置此迭代以在给定条件下重新开始。@Chris_Rands,如果我在一个集合上迭代(意味着将我访问的元素增加一个),我想重置迭代,并在第一个元素开始完全相同的循环,确保我可以访问每个值一次。向上投票的无止境循环-酷…您知道,
cont
是一个将要发生的
NameError
,即使没有,它也永远不会超过1(如果2是迭代的第二个值)…并且仍然是一个无止境的循环;)没有关于什么条件会结束循环的信息。添加了一个计数器,以便更清楚地看到它在某些情况下会损坏。。。但是没有进一步的信息,我只是猜测@patrickartner可能想把
下一个
包装在
中,除了StopIteration:break
。迭代器正是解决我问题的方法。这个问题不关心重置条件是什么-只关心将有一个重置条件。问题是如何执行特定数据结构的重设循环。集合不支持标记我意识到,在发表评论后,需要将其转换为列表,请参见编辑
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()
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
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