views:

176

answers:

5

Hi everybody,

I've got a list of dict in Python:

dico_cfg = {'name': entry_name, 'ip': entry_ip, 'vendor': combo_vendor, 'stream': combo_stream}
self.list_cfg.append(dico_cfg)

I append to my list a lot of dict in the same way.

Now I would like to delete one dict and only one dict in this list? What is the best way to proceed?

I've try with the index of the list, but when I remove a dict from the list, the index is modify, so after some random remove my index doesn't correspond anymore to the dict I want to remove in my list. I hope that is clear. Maybe I can add an "id" row in my dict, so I can ask to remove more preciously the dict I want. I'll ask to remove the dict where id is equal to the id's dict I want to remove. How can I do that?

I hope I'm enough clear. Sorry but I'm a newbie in Python.

A: 

If you have a reference to a dict, d in the list, you can remove it directly without needing to use an index:

list.remove(d)

Justin Ethier
+2  A: 

If you have a reference to the dictionary you want to remove, you can try:

self.list_cfg.remove( your_dictionary )

If you don't have any reference to it, you'll have to try to find it first:

for d in self.list_cfg:
    if d['name']=='Some name': # or some other check to identify your dict
        self.list_cfg.remove(d)
        break
mojbro
+5  A: 

A better solution would be to have a dict of dicts instead, indexed by the id attribute. This way, even if you remove a single dict, the other id's still remain the same.

JSN
Thanks, I've done that and it's work great!
plalex
A: 

If I get you correctly, you don't want the indices to change when you remove an element from your list of dicts. One solution is to use a dict of dicts instead.

dictOne = {'foo':'bar'}
dictTwo = {'bar':'foo'}
dictOfDicts = {0:dictOne, 1:dictTwo} #and so on

#now, del(dict[1]) will remove your element without affecting the indices of the other ones.
Chinmay Kanchi
Yes clearly it's really better to use a dict of dicts!It's easier and my code is even simplier.Best Regards from France!
plalex
+1  A: 

Identifying the dictionaries with an extra entry, as you suggest, is one viable idea:

dico_cfg = {'name': entry_name, 'ip': entry_ip, 'vendor': combo_vendor,
            'stream': combo_stream, 'id': 'dico_cfg'}
self.list_cfg.append(dico_cfg)

and later

self.list_cfg[:] = [d for d in self.list_cfg if d.get('id') != 'dico_cfg']

Note that I'm assigning to the full list slice (the [:] syntax), not to the list name -- the latter may give the impression of working sometimes, but it doesn't modify the list object (just rebinds a name), so if there are other references to the list object they won't be modified. Anyway, assigning to the name (instead of to the [:]) has no advantage unless you want to keep the original object unmodified through other references.

Alex Martelli