简体   繁体   中英

python - remove dictionary from list if exists

I am trying to remove a dictionary from a list if it already exists but it doesn't seem to be working. Can anyone see what I am doing wrong or advise me what I should be doing

new_dict = {'value': 'some value', 'key': 'someKey'}
if new_dict in my_list:
    my_list.remove(new_dict)

new_list is a list of dictionaries where new_dict is definitely in

如果new_dictmy_list是“绝对”的话,那么my_list.remove(new_dict)应该这样做(即, if new_dict in my_list不需要if new_dict in my_list ,只会减慢它的速度)。

my_list = [1,{'value':'some value', 'key' :'somekey'}, 2, {'z':'z', 'x': 'x'}]
new_dict = {'value':'some value', 'key' :'somekey'}
#new_dict = {'z':'z', 'x': 'x'}

differ = 0
matched = 0
for element in my_list:
    if type(element) is types.DictType and matched != 0:
        differ = 0
        # check if dictionary keys match
        if element.viewkeys() == new_dict.viewkeys():
            # check if dictionary values match
            for key in element.keys():
                if element[key] != new_dict[key]:
                    differ = 1
        matched = 1

if differ != 1:
    my_list.remove(new_dict)

print my_list

It worked for both of the dictionaries for me.

In most cases it is clever to build a new list:

 new_list = [ dd for dd in my_list if not dd is new_dict ]

This is typical for a functional programming style, as it avoids side effects. Imagine if you use your solution in a function or method. In most cases you need a modified list only for internal purposes, then modifying an input parameter is dangerous.

Your problem may come from the fact that removing from a list while iterating over the same list is not safe. What you want to do is something like:

copied_list = my_list[:]
if new_dict in copied_list:
    my_list.remove(new_dict)

This way, you iterate over a copy of the list and remove from the original.

This may not be the cause of your problem though. It would be interesting to see:

  • how you build my_list
  • what you do with my_list after the loop, ie how do you realise your dictionary was not removed

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM