2011-09-20 55 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做什麼,即你怎麼知道你的字典裏沒有被移除