Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python dictionary iteration

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]]}
like image 350
marsx Avatar asked Jun 13 '11 15:06

marsx


2 Answers

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] 
like image 133
Amber Avatar answered Nov 03 '22 06:11

Amber


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']} 
like image 39
miku Avatar answered Nov 03 '22 05:11

miku