首页 文章

删除包含特定键的列表下的所有字典[重复]

提问于
浏览
0

这个问题在这里已有答案:

创建一个列表

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

    这种情况正在发生,因为您正在循环中更改可迭代对象 . 最好不要从列表中删除元素,而是将所需的元素追加到新列表中并反转您的条件:

    new_list = []
    for i in list:
        if i['key']!='yes':
                new_list.append(i)
    

    或者你也可以使用 filter ,没有 for 循环:

    list = filter(lambda x: x['key'] != 'yes', list)
    
  • 0

    发生这种情况是因为您用于删除元素的循环 . 您正在迭代它时更改列表 .

    更好的解释如果你在循环中添加一个print语句,你将了解正在发生的事情:

    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)
    
  • 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 元素,现在是 the number 2 instead of the number 1 originally .

    它一直在继续,解释为什么只有大约一半的列表被删除 .

    如果您有疑问,请在下面发表评论:)

相关问题