I have a dictionary dict2
which I want to iter through and remove all entries that contain certain ID numbers in idlist
. dict2[x]
is a list of lists (see example dict2 below). This is the code I have written so far, however it does not remove all instances of the IDs (entry[1]
) that are in the idlist
. Any help?
dict2 = {G1:[[A, '123456', C, D], [A, '654321', C, D], [A, '456123', C, D], [A, '321654', C, D]]}
idlist = ['123456','456123','321654']
for x in dict2.keys():
for entry in dict2[x]:
if entry[1] in idlist:
dict2[x].remove(entry)
if dict2[x] == []:
del dict2[x]
dict2
should end up looking like this :
dict2 = {G1:[[A, '654321', C, D]]}
Try a cleaner version perhaps?
for k in dict2.keys(): dict2[k] = [x for x in dict2[k] if x[1] not in idlist] if not dict2[k]: del dict2[k]
An approach using sets (Note that I needed to change your variables A, B, C, etc. to strings and the numbers in your idlist to actual integers; also this only works, if your IDs are unique and don't occur in other 'fields'):
#!/usr/bin/env python # 2.6 <= python version < 3 original = { 'G1' : [ ['A', 123456, 'C', 'D'], ['A', 654321, 'C', 'D'], ['A', 456123, 'C', 'D'], ['A', 321654, 'C', 'D'], ] } idlist = [123456, 456123, 321654] idset = set(idlist) filtered = dict() for key, value in original.items(): for quad in value: # decide membership on whether intersection is empty or not if not set(quad) & idset: try: filtered[key].append(quad) except KeyError: filtered[key] = quad print filtered # would print: # {'G1': ['A', 654321, 'C', 'D']}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With