【问题标题】:How to remove a dictionary from a list of dictionaries (using a given value)?如何从字典列表中删除字典(使用给定值)?
【发布时间】:2021-11-25 08:31:03
【问题描述】:

基本上,我试图删除字典列表中的指定字典,但不幸的是,我编写的循环仅用于删除第一个字典,并且无法识别同一列表中的其余字典。该代码类似于以下代码:


list=[{"key1" : "value1", "key2" : "value2", "key3" : "value3"}, 
{"key1" : "value1", "key2" : "value2", "key3" : "value3"},
{"key1" : "value1", "key2" : "value2", "key3" : "value3"}]

def drop_dic():

    print("please insert value you want to remove")
    value3=input()
    
    for i in range(len(list)):
        
        if list[i]["key3"] == value3:
            
            key1_drop = vip_list[i]["key1"]
            key2_drop = vip_list[i]["key2"]
            
            del list[i]
            
            print ( key1_drop + " and " + key2_drop + " have been removed.")
            
            break
            
        else:
    
            print("This dict doe not exist")
        
            break

基本上,如果我尝试使用第一个 key3 从列表中删除第一个字典,我可以这样做,但其余的字典只会打印“此字典不存在”

我应该改变什么?

从给定值后的字典列表中删除已识别字典的最佳和最简单的方法是什么?

【问题讨论】:

  • 我不建议你使用 Python 关键字作为变量,因为它可能会破坏程序。例如,将 list 更改为 lstlist1
  • 另外,vip_list 是在哪里定义的?
  • 您的 else 声明不应该存在。如果第一个字典没有通过测试,您将立即转到else 语句并跳出循环。加上其他评论者所说的所有内容。
  • 如果您将else: 与for-loop 放在同一级别,则只有在没有找到匹配项时才会执行(即如果循环没有被break 语句中断)。
  • 谢谢你们!!我只是认为您只能在与先前的 if 语句相同的级别上使用 '''else:''' 而不是在它之前。让我有点困惑,我对 python 很陌生

标签: python list dictionary for-loop if-statement


【解决方案1】:

有几件事正在发生。首先,您的if 子句中有一个break 语句。因此,一旦匹配,循环将停止,您不会删除其他实例。

不过,更重要的是,您在迭代列表时正在编辑列表的内容,这是需要避免的。更好的策略是将当前列表复制到仅包含您想要的内容的新列表中。

vip_list=[
    {"key1" : "value1", "key2" : "value2", "key3" : "value3"}, 
    {"key1" : "value1", "key2" : "value2", "key3" : "value3"},
    {"key1" : "value1", "key2" : "value2", "key3" : "value3"}
]

remove_value = "value3"

filtered_vip_list = [elem for elem in vip_list if elem["key3"] != remove_value]

【讨论】:

    猜你喜欢
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2019-09-04
    • 2010-11-17
    相关资源
    最近更新 更多