Список dict в Python

#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)