2011-09-20 78 views
5

我想从列表中删除字典,如果它已经存在,但它似乎并没有工作。任何人都可以看到我在做什么错还是劝我,我应该做蟒蛇 - 从列表中删除字典,如果存在

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

new_list是字典的一个列表,其中new_dict绝对是

+4

这对我的作品。你如何构建my_list? – Louis

回答

7

如果new_dict是“肯定”的my_list,然后my_list.remove(new_dict)应该做的伎俩(即无需对if new_dict in my_list,只是减缓下来)。

+3

这个。为了安全起见,你可以将它封装在'try/except'中,然后处理'ValueError'。 –

1

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

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

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

+0

你确定要在这里使用'is'而不是== ==吗? –

+0

这不是问题的答案。这是另一种不会改变什么的方式,如果他得到的东西不适合他。就我个人而言,我非常不同意你的观点,即“在大多数情况下,建立一个新名单是很聪明的”。我偶尔会说它会是需要的,但几乎总是会效率低下。 –

+0

@Tim:这取决于。但是,作为使用“in”的问题,你是对的,它应该是“==”。 – rocksportrocker

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 

它适用于我的两本字典。

0

您的问题可能来自于这样的事实:从列表中删除而重复的相同的列表不安全。你想要做的是一样的东西:

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

这样,你遍历表的副本,并从原来的删除。

虽然这可能不是您的问题的原因。这将是有趣的,看看:

  • 你如何建立my_list
  • 你的循环后my_list做什么,即你怎么知道你的字典里没有被移除