geoffreyGIS
geoffreyGIS

Reputation: 363

Problems removing dictionaries from list in Python

I have a couple of pieces of logic within my code where I remove either a key/value or dictionary if the conditions are met. These objects remove while they are in the list, but once they are appended to a top level dictionary and turned into a JSON object, they re-appear, hence negating my logic. What could be the cause of this?

Here is my code sample showing how the dictionaries are appended logic removing keys/values and dictionaries;

dL311 = dict()
d = dict()
d.setdefault("DriverFirstName",last_edited_user )
d.setdefault("DriverLastName","Aguilar" )
d.setdefault("LastUpdatedBy", "SANSTAR1")
d.setdefault("DACType", dar_item_1)
d.setdefault("Type", "Dead Animal Removal")
d.setdefault("Name", dar_uid_1 )
d.setdefault("DACItemCount", dar_qyt_1)
l311.append(d)
dL311 = dict()
d = dict()
d.setdefault("DriverFirstName",last_edited_user )
d.setdefault("DriverLastName","Aguilar" )
d.setdefault("LastUpdatedBy", "SANSTAR1")
d.setdefault("DACType", dar_item_2)
d.setdefault("Type", "Dead Animal Removal")
d.setdefault("Name", dar_uid_2)
d.setdefault("DACItemCount", dar_qyt_2)
l311.append(d)
d = dict()
d.setdefault("DriverFirstName",last_edited_user )
d.setdefault("DriverLastName","Aguilar" )
d.setdefault("LastUpdatedBy", "SANSTAR1")
d.setdefault("DACType", dar_item_3)
d.setdefault("Type", "Dead Animal Removal")
d.setdefault("Name", dar_uid_3)
d.setdefault("DACItemCount", dar_qyt_3)
l311.append(d)
d = dict()
d.setdefault("DriverFirstName",last_edited_user )
d.setdefault("DriverLastName","Aguilar" )
d.setdefault("LastUpdatedBy", "SANSTAR1")
d.setdefault("DACType", dar_item_4)
d.setdefault("Type", "Dead Animal Removal")
d.setdefault("Name", dar_uid_4)
d.setdefault("DACItemCount", dar_qyt_4)
l311.append(d)
d = dict()
d.setdefault("DriverFirstName",last_edited_user )
d.setdefault("DriverLastName","Aguilar" )
d.setdefault("LastUpdatedBy", "SANSTAR1")
d.setdefault("DACType", dar_item_5)
d.setdefault("Type", "Dead Animal Removal")
d.setdefault("Name", dar_uid_5)
d.setdefault("DACItemCount", dar_qyt_5)
l311.append(d)
d = dict()
d.setdefault("DriverFirstName",last_edited_user )
d.setdefault("DriverLastName","Aguilar" )
d.setdefault("LastUpdatedBy", "SANSTAR1")
d.setdefault("DACType", dar_item_6)
d.setdefault("Type", "Dead Animal Removal")
d.setdefault("Name", dar_uid_6)
d.setdefault("DACItemCount", dar_qyt_6)
l311.append(d)
d = dict()
d.setdefault("DriverFirstName",last_edited_user )
d.setdefault("DriverLastName","Aguilar" )
d.setdefault("LastUpdatedBy", "SANSTAR1")
d.setdefault("DACType", dar_item_7)
d.setdefault("Type", "Dead Animal Removal")
d.setdefault("Name", dar_uid_7)
d.setdefault("DACItemCount", dar_qyt_7)
l311.append(d)
d = dict()
d.setdefault("DriverFirstName",last_edited_user )
d.setdefault("DriverLastName","Aguilar" )
d.setdefault("LastUpdatedBy", "SANSTAR1")
d.setdefault("DACType", dar_item_8)
d.setdefault("Type", "Dead Animal Removal")
d.setdefault("Name", dar_uid_8)
d.setdefault("DACItemCount", dar_qyt_8)
l311.append(d)
d = dict()
d.setdefault("DriverFirstName",last_edited_user )
d.setdefault("DriverLastName","Aguilar" )
d.setdefault("LastUpdatedBy", "SANSTAR1")
d.setdefault("DACType", dar_item_9)
d.setdefault("Type", "Dead Animal Removal")
d.setdefault("Name", dar_uid_9)
d.setdefault("DACItemCount", dar_qyt_9)
l311.append(d)
d = dict()
d.setdefault("DriverFirstName",last_edited_user )
d.setdefault("DriverLastName","Aguilar" )
d.setdefault("LastUpdatedBy", "SANSTAR1")
d.setdefault("DACType", dar_item_10)
d.setdefault("Type", "Dead Animal Removal")
d.setdefault("Name", dar_uid_10)
d.setdefault("DACItemCount", dar_qyt_10)
l311.append(d)

for d in l311:
    if(d['Name'].strip() == '') and((type(d['DACItemCount']) != int) or (d['DACItemCount']==0)):
        del d['Name']
        del d['DACItemCount']

lIndexes = []
nCnt = len(l311)
for i in range(nCnt):
    dd = l311[i]
    if(dd==d):
        lIndexes.append(i)


for i in lIndexes:
    i

#remove the d from the original l311 in a reverse order:
# print ("order (of index) in which items are deleted:" )
for ii in reversed(lIndexes):
    if  d.setdefault("Name", dar_uid_10) == ' ':
        # print(ii)
        del l311[ii]


print  (l311)


dL311 = dict()
dL311.setdefault("DeadAnimalRemoval", l311)
dResult.setdefault("ListOfLa311DeadAnimalRemoval",dL311)

#Ends of adding additional itmes ****************************************
lResults.append({"MetaData": {}, "SRData": dResult})

Example Output using the code above;

[{'Name': '071920150633557841', 'DACType': ' ', 'DriverLastName': 'Aguilar', 'DriverFirstName': 'SA', 'LastUpdatedBy': 'SANSTAR1', 'DACItemCount': '0', 'Type': 'Dead Animal Removal'}]

JSON output without removed dictionaries;

{
        "MetaData": {}, 
        "SRData": {
            "ListOfLa311DeadAnimalRemoval": {
                "DeadAnimalRemoval": [
                    {
                        "DACItemCount": "0", 
                        "DACType": " ", 
                        "DriverFirstName": "SA", 
                        "DriverLastName": "Aguilar", 
                        "LastUpdatedBy": "SANSTAR1", 
                        "Name": "071920150633557841", 
                        "Type": "Dead Animal Removal"
                    }, 
                    {
                        "DACType": " ", 
                        "DriverFirstName": "SA", 
                        "DriverLastName": "Aguilar", 
                        "LastUpdatedBy": "SANSTAR1", 
                        "Name": " ", 
                        "Type": "Dead Animal Removal"
                    }
                ]
            }, 
            "ReasonCode": "", 
            "ResolutionCode": "A", 
            "SRNumber": "1-21630001"
        }
    }
]

I am expecting to have the second dictionary removed since there is no 'Name' value.

Upvotes: 0

Views: 49

Answers (1)

Patrick Maupin
Patrick Maupin

Reputation: 8137

If you delete a name, then if d.setdefault("Name", dar_uid_10) == ' ' will add the name back -- as dar_uid_10. Unless dar_uid_10 == ' ', then this code will never think that a dictionary has a name that is a space.

Just use if 'Name' not in d instead, I think.

Upvotes: 1

Related Questions