#python #list #dictionary
#python #Список #словарь
Вопрос:
У меня есть список dict в Python:
dico_cfg = {'name': entry_name, 'ip': entry_ip, 'vendor': combo_vendor, 'stream': combo_stream}
self.list_cfg.append(dico_cfg)
Я добавляю в свой список множество dict таким же образом.
Теперь я хотел бы удалить один dict и только один dict в этом списке? Каков наилучший способ продолжить?
Я попробовал с индексом списка, но когда я удаляю dict из списка, индекс изменяется, поэтому после некоторого случайного удаления мой индекс больше не соответствует dict, который я хочу удалить из моего списка. Я надеюсь, что это понятно. Возможно, я смогу добавить строку «id» в свой dict, чтобы я мог попросить удалить более ценный dict, который я хочу. Я попрошу удалить dict, идентификатор которого равен dict идентификатора, который я хочу удалить. Как я могу это сделать?
Надеюсь, я достаточно ясно выразился. Извините, но я новичок в Python.
Ответ №1:
Лучшим решением было бы вместо этого иметь dict of dicts, индексированный атрибутом id. Таким образом, даже если вы удалите один dict, остальные идентификаторы останутся прежними.
Ответ №2:
Если у вас есть ссылка на словарь, который вы хотите удалить, вы можете попробовать:
self.list_cfg.remove( your_dictionary )
Если у вас нет на него никаких ссылок, вам придется сначала попытаться его найти:
for d in self.list_cfg:
if d['name']=='Some name': # or some other check to identify your dict
self.list_cfg.remove(d)
break
Ответ №3:
Если я вас правильно понял, вы не хотите, чтобы индексы менялись при удалении элемента из вашего list
of dict
s. Одним из решений является использование вместо этого dict
of dict
s.
dictOne = {'foo':'bar'}
dictTwo = {'bar':'foo'}
dictOfDicts = {0:dictOne, 1:dictTwo} #and so on
#now, del(dict[1]) will remove your element without affecting the indices of the other ones.
Комментарии:
1. Да, очевидно, что действительно лучше использовать dict of dicts! Это проще, а мой код еще проще. С наилучшими пожеланиями из Франции!
Ответ №4:
Идентификация словарей с дополнительной записью, как вы предлагаете, является одной из жизнеспособных идей:
dico_cfg = {'name': entry_name, 'ip': entry_ip, 'vendor': combo_vendor,
'stream': combo_stream, 'id': 'dico_cfg'}
self.list_cfg.append(dico_cfg)
и более поздние версии
self.list_cfg[:] = [d for d in self.list_cfg if d.get('id') != 'dico_cfg']
Обратите внимание, что я присваиваю срезу полного списка ( [:]
синтаксису), а не имени списка — иногда может показаться, что последнее работает, но оно не изменяет объект list (просто повторно привязывает имя), поэтому, если есть другие ссылки на объект list, они не будут изменены. В любом случае, присвоение имени (вместо [:]
) не имеет никакого преимущества, если вы не хотите сохранить исходный объект неизмененным с помощью других ссылок.
Ответ №5:
Если у вас есть ссылка на dict d
в списке, вы можете удалить ее напрямую, не прибегая к использованию индекса:
list.remove(d)