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()
方法
下面是一个使用sets
的示例(但它也可以是一个列表或任何其他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