python - 如果存在则从列表中删除字典

时间:2011-09-20 11:44:35

标签: python

我试图从列表中删除一个字典,如果它已经存在但它似乎没有工作。任何人都可以看到我做错了什么或建议我应该做什么

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

new_list是一个字典列表,其中new_dict肯定在

4 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

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

它适用于我的两个词典。

答案 2 :(得分:1)

在大多数情况下,建立一个新列表很聪明:

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

这是函数式编程风格的典型特征,因为它避免了副作用。想象一下,如果您在函数或方法中使用您的解决方案。在大多数情况下,您只需要为内部目的修改列表,然后修改输入参数是危险的。

答案 3 :(得分:0)

您的问题可能来自于在迭代相同列表时从列表中删除是不安全的。你想做的是:

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

这样,您可以遍历列表的副本并从原始列表中删除。

但这可能不是导致问题的原因。有趣的是看到:

  • 您如何构建my_list
  • 你在循环后使用my_list做什么,即你怎么意识到你的字典没有被删除