如何重置在集合上迭代的循环?遍历列表的一个常见答案是重置用于访问列表的索引,但是集合不支持索引。
关键是要能够迭代大量对象,对每个元素执行一些操作,直到结果与我需要的结果匹配为止。我要搜索的功能是重置循环的功能。意思是从头开始重新进行迭代,以确保无论出于何种原因我都能再次访问每个元素。
如何重置以下循环?
for element in some_set:
print element
if element + offset == needed_result:
# reset
针对此特定问题,我使用python 2.7,但我也欢迎python 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的答案中)。