2011-09-20 22 views
5

Próbuję usunąć słownik z listy, jeśli już istnieje, ale prawdopodobnie nie działa. Czy każdy może zobaczyć, co robię źle albo mi doradzić co powinienem robićpython - usuń słownik z listy, jeśli istnieje

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

new_list jest lista słowników gdzie new_dict jest zdecydowanie w

+4

To działa na mnie. Jak zbudować my_list? – Louis

Odpowiedz

7

Jeśli new_dict jest „zdecydowanie” w my_list, następnie my_list.remove(new_dict) powinno załatwić sprawę (czyli nie potrzeba if new_dict in my_list, że tylko spowalnia go).

+3

To. Aby być po bezpiecznej stronie, możesz zawinąć to w 'try/except' i poradzić sobie z' ValueError's wtedy. –

1

W większości przypadków jest to mądry, aby zbudować nową listę:

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

Jest to typowe dla funkcjonalnego stylu programowania, ponieważ pozwala uniknąć efektów ubocznych. Wyobraź sobie, że używasz rozwiązania w funkcji lub metodzie. W większości przypadków potrzebujesz zmodyfikowanej listy tylko do wewnętrznych celów, a modyfikowanie parametru wejściowego jest niebezpieczne.

+0

Czy na pewno chcesz użyć 'jest' tutaj zamiast' == '? –

+0

To nie jest odpowiedź na pytanie. To inny sposób, który niczego nie zmieni, jeśli to, co ma, nie działa dla niego. I osobiście zdecydowanie nie zgadzam się z tobą, że "w większości przypadków sprytnie jest zbudować nową listę". Powiedziałbym, że czasami będzie to pożądane, ale prawie zawsze będzie nieskuteczne. –

+0

@Tim: To zależy. Ale jak pytanie użyte w "in", masz rację, powinno być "==". – 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 

Dla obu słowników zadziałało.

0

Twój problem może wynikać z faktu, że usunięcie z listy podczas iteracji na tej samej liście nie jest bezpieczne. To, co chcesz zrobić, to coś w rodzaju:

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

W ten sposób wykonujesz iterację na kopii listy i usuwasz ją z oryginału.

Nie może to być przyczyną problemu. Byłoby interesujące zobaczyć:

  • jak budować my_list
  • co zrobić z my_list po pętli, czyli jak zrobić sobie sprawę słownika nie został usunięty