删除包含特定键的列表下的所有字典

时间:2018-12-10 07:51:20

标签: python list dictionary

创建列表

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 个答案:

答案 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

它不断地在继续,解释了为什么只有大约一半的列表被删除。

如有疑问,请在下面评论:)

相关问题