创建列表
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'}]
只删除偶数,为什么?
答案 0 :(得分:0)
之所以发生这种情况,是因为您在循环时更改了可迭代对象。 最好不要从列表中删除元素,而是将所需的元素追加到新列表中并逆转条件:
new_list = []
for i in list:
if i['key']!='yes':
new_list.append(i)
或者,您也可以将filter
用于此目的而无需进行for
循环:
list = filter(lambda x: x['key'] != 'yes', list)
答案 1 :(得分:0)
之所以发生这种情况,是因为您正在使用循环删除该元素。您正在迭代列表时更改了列表。
更好的解释是,如果在循环中添加打印语句,您将了解正在发生的事情:
for i in list:
print(i)
if i['key']=='yes':
list.remove(i)
输出为:
{'number': 3, 'key': 'yes'}
{'number': 7, 'key': 'yes'}
{'number': 11, 'key': 'yes'}
要解决此问题,您可以将元素添加到新列表中,然后再将其删除。
to_delete_list = []
for i in list:
if i['key']!='yes':
to_delete_list.append(i)
答案 2 :(得分:0)
永远不要遍历要删除项目的列表。执行此操作时,需要非常小心。我们将举一个例子,以便您可以更清楚地看到它。
看看下面的代码,看看发生了什么:
arr = list(range(10))
for index, elem in enumerate(arr):
print("Before deletion : {}".format(arr))
arr.remove(elem)
print("Element deleted : {}".format(elem))
print("After deletion : {}".format(arr), end='\n\n')
# Before deletion : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# Element deleted : 0
# After deletion : [1, 2, 3, 4, 5, 6, 7, 8, 9]
# Before deletion : [1, 2, 3, 4, 5, 6, 7, 8, 9]
# Element deleted : 2
# After deletion : [1, 3, 4, 5, 6, 7, 8, 9]
# Before deletion : [1, 3, 4, 5, 6, 7, 8, 9]
# Element deleted : 4
# After deletion : [1, 3, 5, 6, 7, 8, 9]
# Before deletion : [1, 3, 5, 6, 7, 8, 9]
# Element deleted : 6
# After deletion : [1, 3, 5, 7, 8, 9]
# Before deletion : [1, 3, 5, 7, 8, 9]
# Element deleted : 8
# After deletion : [1, 3, 5, 7, 9]
在第一次迭代中。您可以看到所有元素都在这里。然后,您指向的元素(此处为数字0)将被删除,而第一个元素现在是第二个元素。
这是使您感到困惑的步骤。您现在开始循环的第二次迭代,但是原始列表已更改。正如您期望的那样,您指向列表的 second 元素,该元素现在是数字2而不是原来的数字1 。
它不断地在继续,解释了为什么只有大约一半的列表被删除。
如有疑问,请在下面评论:)