Python 字典:pop 或 del

Python dictionary: pop or del

我无法理解 python 字典

假设我有一个名为 data 的字典,它看起来像这样:

{ "computers": [
    {"Netbios_Name0": "apple1", "User_Domain0": "paradise", "User_Name0": "adam", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9058.1018"}, 
    {"Netbios_Name0": "apple2", "User_Domain0": "paradise", "User_Name0": "lilith", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9040.1044"}, 
    {"Netbios_Name0": "apple3", "User_Domain0": "paradise", "User_Name0": "eve", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9068.1026"}
]}

我想删除 apple2,所以我的最终结果如下所示:

{ "computers": [
    {"Netbios_Name0": "apple1", "User_Domain0": "paradise", "User_Name0": "adam", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9058.1018"},  
    {"Netbios_Name0": "apple3", "User_Domain0": "paradise", "User_Name0": "eve", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9068.1026"}
]}

我怀疑我必须做这样的事情:

for item in data['computers']:
    if "apple2" in item['Netbios_Name0']:
        item.pop() # or del data[item]

但我无法让它工作。

您可以使用 remove():

data = { "computers": [
    {"Netbios_Name0": "apple1", "User_Domain0": "paradise", "User_Name0": "adam", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9058.1018"}, 
    {"Netbios_Name0": "apple2", "User_Domain0": "paradise", "User_Name0": "lilith", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9040.1044"}, 
    {"Netbios_Name0": "apple3", "User_Domain0": "paradise", "User_Name0": "eve", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9068.1026"}
]}

for item in list(data['computers']):
    if 'apple2' in item['Netbios_Name0']:
        data['computers'].remove(item)
data

输出:

{'computers': [{'Netbios_Name0': 'apple1',
   'User_Domain0': 'paradise',
   'User_Name0': 'adam',
   'SMS_Installed_Sites0': 'heaven',
   'Client_Version0': '5.00.9058.1018'},
  {'Netbios_Name0': 'apple3',
   'User_Domain0': 'paradise',
   'User_Name0': 'eve',
   'SMS_Installed_Sites0': 'heaven',
   'Client_Version0': '5.00.9068.1026'}]}

您正在迭代列表 - 您可以按索引从列表中弹出。

永远不要在迭代时修改列表长度:How to remove items from a list while iterating?

一种方法是存储要删除的索引并在以后删除它们:

data = { "computers": [
    {"Netbios_Name0": "apple1", "User_Domain0": "paradise", "User_Name0": "adam", 
     "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9058.1018"}, 
    {"Netbios_Name0": "apple2", "User_Domain0": "paradise", "User_Name0": "lilith", 
     "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9040.1044"}, 
    {"Netbios_Name0": "apple3", "User_Domain0": "paradise", "User_Name0": "eve", 
     "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9068.1026"}
]}

to_delete = []
for idx, inner_dic in enumerate(data['computers']):
    if "apple2" in inner_dic['Netbios_Name0']:
        to_delete.append(idx)
# remove biggest to lowest indexes - removing does not influence the order 
for idx in to_delete[::-1]:
    data['computers'].pop(idx)

print(data)

输出:

{'computers': 
    [{'Netbios_Name0': 'apple1', 'User_Domain0': 'paradise', 'User_Name0': 'adam', 
      'SMS_Installed_Sites0': 'heaven', 'Client_Version0': '5.00.9058.1018'}, 
     {'Netbios_Name0': 'apple3', 'User_Domain0': 'paradise', 'User_Name0': 'eve', 
      'SMS_Installed_Sites0': 'heaven', 'Client_Version0': '5.00.9068.1026'}]
}

Python 的 built-in 枚举函数允许我们遍历列表并检索列表中每个项目的索引和值:

data = { "computers": [
    {"Netbios_Name0": "apple1", "User_Domain0": "paradise", "User_Name0": "adam", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9058.1018"}, 
    {"Netbios_Name0": "apple2", "User_Domain0": "paradise", "User_Name0": "lilith", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9040.1044"}, 
    {"Netbios_Name0": "apple3", "User_Domain0": "paradise", "User_Name0": "eve", "SMS_Installed_Sites0": "heaven", "Client_Version0": "5.00.9068.1026"}
]}

# Here 0 in 2nd argument is the starting number for num variable, can be used 0 to indicate as index
for num, computer in enumerate(data["computers"], 0):
    if computer["Netbios_Name0"] == "apple2":
        del data["computers"][num]

print(data)

这应该有效。

您可以在这里找到更多信息:https://realpython.com/iterate-through-dictionary-python/