2016-03-07 2 views
1

У меня есть кортеж dicts в виде:Как удалить элемент dict из кортежа dicts?

mylist = ({'a': 'a0', 't': 't0'}, {'a': 'a1', 't': 't1'}, {'a': 'a2', 't': 't2'}, ...) 

Как я могу удалить с Dict в цикл? Я попытался следующие, но в конце doc еще в кортеже:

for doc in mylist: 
    if doc['a']=="a0": 
     del doc 
+2

Вы пытаетесь удалить элемент из списка по мере повтора через этот список? Это, как правило, очень плохая идея. –

+3

Кортежи неизменяемы, вам нужно будет создать новый кортеж, который не включает соответствующие элементы. – jonrsharpe

+1

Ваш код в основном выполняет 'doc = mylist [0]; del doc' ..., это никак не повлияет на контейнер, вы просто удаляете ссылку 'doc' в цикле. –

ответ

5

Прежде всего, не следует использовать имя list, вы теневые встроенный в списке.

Кортежи неизменяемы, поэтому вам нужно построить новый кортеж.

>>> t = ({'a': 'a0', 't': 't0'}, {'a': 'a1', 't': 't1'}, {'a': 'a2', 't': 't2'}) 
>>> tuple(d for d in t if d['a'] != 'a0') 
({'a': 'a1', 't': 't1'}, {'a': 'a2', 't': 't2'}) 

Это предполагает, что все ваши словари на самом деле имеют ключевое 'a'. Если это не так, не стесняйтесь добавлять код ошибки или использовать метод словаря get с резервным значением в выражении генератора.

2

Для начала; вы определили Tuple, а не List. Основное различие между ними состоит в том, что Tuples - immutable. Это означает, что если вы хотите изменить свою коллекцию, вам нужно будет использовать список:

my_list = [{'a': 'a0', 't': 't0'}, {'a': 'a1', 't': 't1'}, {'a': 'a2', 't': 't2'}] 

Обратите внимание на использование квадратных скобок, а не круглые.

С этими знаниями, вы можете выбрать:

построить еще кортеже опуская значения, которые вы хотите удалить:

my_tuple = ({'a': 'a0', 't': 't0'}, {'a': 'a1', 't': 't1'}, {'a': 'a2', 't': 't2'}) 
my_new_tuple = tuple(item for item in my_tuple if item['a'] != 'a0') 

Или используйте список, и удалить значения, которые дон 't want:

my_list = [{'a': 'a0', 't': 't0'}, {'a': 'a1', 't': 't1'}, {'a': 'a2', 't': 't2'}] 
for item in my_list: 
    if item['a'] == 'a0': 
     my_list.remove(item) 
+0

@MSeifert Вы правы, моя ошибка! Я исправил это сейчас. – NixonInnes

+0

@timgeb Вы правы; Я добавлю еще один пример без вложенных циклов. – NixonInnes

+2

['list.remove'] (http://stackoverflow.com/questions/17299581/loop-forgets-to-remove-some-items) - плохое предложение. –

Смежные вопросы