同时从结构中删除元素的同时,在python中迭代数据结构的正确方法是什么?
我想遍历someList
结构,并确保到达列表中的所有项目,只要它们在列表中就行,并在迭代时删除其中一些项目。但是我不明白为什么会跳过一些数字,以及如何避免这种情况。确保在不事先删除的情况下,实际上只一次看到列表中的每个元素。在示例中,我从未看到1
,5
和8
class someList():
def __init__(self):
self.list = list(range(0,10))
def getData(self):
for i in self.list:
print(i)
yield i
thing = someList()
for a in thing.getData():
print("we reached:", a)
if a % 2 == 1:
print("remove", a)
thing.list.remove(a)
elif (a * 2) in thing.list:
print("remove double a:", a, " a*2:", a * 2)
thing.list.remove(a*2)
print(thing.list)
输出:
0
we reached: 0
remove double a: 0 a*2: 0
2
we reached: 2
remove double a: 2 a*2: 4
3
we reached: 3
remove 3
6
we reached: 6
7
we reached: 7
remove 7
9
we reached: 9
remove 9
[1, 2, 5, 6, 8]
目标输出:
0
we reached: 0
remove double a: 0 a*2: 0
1
we reached: 1
remove 1
2
we reached: 2
remove double a: 2 a*2: 4
3
we reached: 3
remove 3
5
we reached: 5
remove 5
6
we reached: 6
7
we reached: 7
remove 7
8
we reached: 8
9
we reached: 9
remove 9
[2, 6, 8]
注意:这与How to remove items from a list while iterating?不同,因为我不想在迭代之前滤除元素。
这两个修改条件只是示例,因为我确实确实遍历了图形数据结构,使用了当前元素并删除了一些与当前元素有特定关系的元素。
正如其他人所说,如果您尝试在运行时修改列表,将不会得到正确的初始化,因此请使用另一个列表来存储要删除的内容,
class someList():
def __init__(self):
self.list = list(range(0,10))
def getData(self):
for i in self.list:
print(i)
yield i
thing = someList()
rem_list=[]
for a in thing.getData():
print("we reached:", a)
if a in rem_list:
pass
elif a % 2 == 1:
print("remove", a)
rem_list.append(a)
elif (a * 2) in thing.list:
print("remove double a:", a, " a*2:", a * 2)
rem_list.append(2*a)
thing.list=[x for x in thing.list if x not in rem_list]
print(thing.list) #outputs [2, 6, 8]
使用rem_list存储要删除的成员并且不循环检查它们会给您预期的结果。