这个问题在这里已有答案:
创建一个列表
list=[]
for i in range(0,15):
dict={}
dict['number']=i
dict['key']='yes'
list.append(dict)
print(list)
我们有类似的东西:
[{'number': 0, 'key': 'yes'}, {'number': 1, 'key': 'yes'}, {'number': 2, 'key': 'yes'}, {'number': 3, 'key': 'yes'}, {'number': 4, 'key': 'yes'}, {'number': 5, 'key': 'yes'}, {'number': 6, 'key': 'yes'}, {'number': 7, 'key': 'yes'}, {'number': 8, 'key': 'yes'}, {'number': 9, 'key': 'yes'}, {'number': 10, 'key': 'yes'}, {'number': 11, 'key': 'yes'}, {'number': 12, 'key': 'yes'}, {'number': 13, 'key': 'yes'}, {'number': 14, 'key': 'yes'}]
然后尝试删除包含 'key'=='yes'
的所有字典
for i in list:
if i['key']=='yes':
list.remove(i)
print(list)
我们有:
[{'number': 1, 'key': 'yes'}, {'number': 3, 'key': 'yes'}, {'number': 5, 'key': 'yes'}, {'number': 7, 'key': 'yes'}, {'number': 9, 'key': 'yes'}, {'number': 11, 'key': 'yes'}, {'number': 13, 'key': 'yes'}]
只删除偶数,为什么?
3 回答
这种情况正在发生,因为您正在循环中更改可迭代对象 . 最好不要从列表中删除元素,而是将所需的元素追加到新列表中并反转您的条件:
或者你也可以使用
filter
,没有for
循环:发生这种情况是因为您用于删除元素的循环 . 您正在迭代它时更改列表 .
更好的解释如果你在循环中添加一个print语句,你将了解正在发生的事情:
输出是:
要解决此问题,您可以将元素添加到新列表中,然后将其删除 .
您永远不应遍历要删除项目的列表 . 当你这样做时,你需要非常小心 . 我们将举一个例子,以便您可以更清楚地看到它 .
看看下面的代码,看看发生了什么:
在第一次迭代 . 您可以看到所有元素都在这里 . 然后,您指向的元素(此处为数字0)将被删除,您的第一个元素现在是您的第二个元素 .
这是令你困惑的一步 . 您现在开始循环的第二次迭代,但您的原始列表已更改 . 正如预期的那样,您指向列表的 second 元素,现在是 the number 2 instead of the number 1 originally .
它一直在继续,解释为什么只有大约一半的列表被删除 .
如果您有疑问,请在下面发表评论:)