Python 有可能移除元件的循环
我正在尝试编写一个类,该类的工作方式与itertools模块中的循环相同,但具有一些附加功能。我希望能够从我正在迭代的列表中删除元素 这是我的密码:Python 有可能移除元件的循环,python,Python,我正在尝试编写一个类,该类的工作方式与itertools模块中的循环相同,但具有一些附加功能。我希望能够从我正在迭代的列表中删除元素 这是我的密码: class myCycle(object): def __init__(self, list): self.list = list def __iter__(self): def iter(self): while True: if not s
class myCycle(object):
def __init__(self, list):
self.list = list
def __iter__(self):
def iter(self):
while True:
if not self.list:
break
for e in self.list:
yield e
return iter(self)
def remove(self, e):
self.list.remove(e)
它工作正常,只有一个例外。让我们看一个例子:
>>> for i in c:
... print i
... if i == 1:
... c.remove(1)
... if i == 3:
... break
...
1
3
>>>
从列表中删除1后,索引将移动,这可能就是我的输出中没有2的原因
但是我怎样才能让它工作呢?或者可能有其他方法来获得此功能
编辑:
在您的评论之后,我将尝试解释我正在尝试做的事情
我有一个包含玩家动作的字符串,可以如下所示:
actions = "sBcffcffcfrfccc"
这是从扑克,动作f平均折叠,c呼叫等一。对我们来说最有趣的是折叠
我还有球员名单:
players = ['Saxum', 'Erasmus', 'Anders', 'Ginger', 'Adam',
'Crusoe', 'OgoPogo', 'Hari', 'Sanja', 'Hooke']
我想给每个玩家分配动作。因此,我们将通过行动和玩家:
Saxum -> s
Erasmus -> B
Anders -> c
Ginger -> f
Ginger folded, we should remove this player. So how player list look like now:
players = ['Saxum', 'Erasmus', 'Anders', 'Adam',
'Crusoe', 'OgoPogo', 'Hari', 'Sanja', 'Hooke']
Adam -> f
Adam folded, we should remove this player. So how player list look like now:
players = ['Saxum', 'Erasmus', 'Anders',
'Crusoe', 'OgoPogo', 'Hari', 'Sanja', 'Hooke']
Crusoe -> c
OgoPogo -> f
OgoPogo folded, we should remove this player. So how player list look like now:
players = ['Saxum', 'Erasmus', 'Anders',
'Crusoe', 'Hari', 'Sanja', 'Hooke']
Hari -> f
Hari folded, we should remove this player. So how player list look like now:
players = ['Saxum', 'Erasmus', 'Anders',
'Crusoe', 'Sanja', 'Hooke']
Sanja -> c
Hooke -> f
Hooke folded, we should remove this player. So how player list look like now:
players = ['Saxum', 'Erasmus', 'Anders',
'Crusoe', 'Sanja']
Hooke was last on the list, so we start from beginning.
Saxum -> r
Erasmus -> f
Erasmus folded, we should remove this player. So how player list look like now:
players = ['Saxum', 'Anders',
'Crusoe', 'Sanja']
Anders -> c
Crusoe -> c
Sanja -> c
这就是我开始实施myCycle的原因。但也许有更好的方法可以做到这一点?您可以使用
while
循环:
index = 0
while index < len(my_list):
if got_to_remove(my_list[index]):
del l[index]
else:
index += 1
index=0
而索引
现在,正如对您的问题的评论中所指出的,您可能会找到一个更优雅的解决方案。不要删除列表中的项目,而是将它们替换为
None
:
class MyCycle(object):
def __init__(self, lst):
self.list = lst
def __iter__(self):
while True:
items_left = False
for x in self.list:
if x is not None:
items_left = True
yield x
if not items_left:
return
def remove(self, e):
self.list[self.list.index(e)] = None
实际上,这可以通过手工制作迭代器而不是使用生成器函数来实现
class myCycle(object):
def __init__(self, list):
self.list = list
self.i = 0
def __next__(self):
try:
return self.list[self.i]
except IndexError:
raise StopIteration, "list is empty"
finally:
self.i = self.i + 1
if self.i >= len(self.list):
self.i = 0
next = __next__
def __iter__(self):
return self
def remove(self, e):
i = self.list.index(e)
del self.list[i]
if self.i >= i:
self.i = self.i - 1
if self.i >= len(self.list):
self.i = 0
它是否需要在循环时删除元素,或者可以在完成时批量删除它们?我必须在循环时删除元素…不要这样做。在迭代时修改iterable是一个糟糕的想法。我相信你们可以想出更好的解决方案。为什么在迭代时必须删除?我用“原因”编辑了我的问题。谢谢,这个想法对我来说很好。