Список диктов в Python - PullRequest
       13

Список диктов в Python

1 голос
/ 24 марта 2010

У меня есть список dict в Python:

dico_cfg = {'name': entry_name, 'ip': entry_ip, 'vendor': combo_vendor, 'stream': combo_stream}
self.list_cfg.append(dico_cfg)

Я так же добавляю в свой список много диктов.

Теперь я хотел бы удалить один и только один диктант в этом списке? Как лучше поступить?

Я пробовал с индексом списка, но когда я удаляю dict из списка, индекс изменяется, поэтому после некоторого случайного удаления мой индекс больше не соответствует тому, что я хочу удалить в моем список. Я надеюсь, что это понятно. Может быть, я могу добавить строку «id» в мой dict, чтобы я мог попросить удалить более ценное, что я хочу. Я попрошу удалить диктовку, где идентификатор равен диктовке идентификатора, которую я хочу удалить. Как я могу это сделать?

Надеюсь, я достаточно ясно. Извините, но я новичок в Python.

Ответы [ 5 ]

8 голосов
/ 24 марта 2010

Лучшим решением было бы вместо этого иметь слово dict, индексируемое атрибутом id. Таким образом, даже если вы удалите один диктет, другие идентификаторы останутся прежними.

2 голосов
/ 24 марта 2010

Если у вас есть ссылка на словарь, который вы хотите удалить, вы можете попробовать:

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
1 голос
/ 24 марта 2010

Идентификация словарей с дополнительной записью, как вы предлагаете, является одной жизнеспособной идеей:

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']

Обратите внимание, что я назначаю полный список среза (синтаксис [:]), не списку имя - последний может иногда создается впечатление работы, но это не изменяет объект списка (просто повторяет имя), поэтому, если есть другие ссылки на объект списка, они не будут изменены. В любом случае, присвоение имени (вместо [:]) не имеет никакого преимущества , если только вы не захотите сохранить исходный объект неизмененным с помощью других ссылок.

1 голос
/ 24 марта 2010

Если я вас правильно понял, вы не хотите, чтобы индексы менялись, когда вы удаляете элемент из ваших list из dict s. Одним из решений является использование dict из 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.
0 голосов
/ 24 марта 2010

Если у вас есть ссылка на диктовку, d в списке, вы можете удалить ее напрямую, не используя индекс:

list.remove(d)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...