2010-03-24 7 views
1

J'ai une liste de dict en Python:Liste des dict en Python

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

J'ajouter à ma liste beaucoup de dict de la même manière.

Maintenant, je voudrais supprimer un dict et un seul dict dans cette liste? Quelle est la meilleure façon de procéder?

J'ai essayé avec l'index de la liste, mais quand je supprime un dict de la liste, l'index est modifié, donc après un retrait aléatoire mon index ne correspond plus à la dict que je veux enlever ma liste. J'espère que c'est clair. Peut-être que je peux ajouter une ligne "id" dans mon dict, donc je peux demander de supprimer plus précieusement la dict que je veux. Je vais demander de supprimer le dict où id est égal à la dict de l'identifiant que je veux supprimer. Comment puis-je faire cela?

J'espère que je suis assez clair. Désolé mais je suis un débutant en Python.

Répondre

0

Si vous avez une référence à un dict, d dans la liste, vous pouvez le supprimer directement, sans avoir besoin d'utiliser un indice:

list.remove(d)

2

Si vous avez une référence au dictionnaire que vous voulez supprimer, vous pouvez essayer:

self.list_cfg.remove(your_dictionary) 

Si vous n'avez pas référence à, vous devrez essayer de trouver d'abord:

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 
8

Une meilleure solution serait d'avoir un dict de dicts au lieu, indexés par l'attribut id. De cette façon, même si vous supprimez une seule dict, les autres id restent toujours les mêmes.

+0

Merci, je l'ai fait et il est un excellent travail! – plalex

1

Si je vous comprends bien, vous ne voulez pas que les index changent lorsque vous supprimez un élément de votre list de dict s. Une solution consiste à utiliser un dict de dict à la place.

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

Oui clairement, il est vraiment préférable d'utiliser une dictée de dicts! C'est plus simple et mon code est encore plus simple. Cordialement de France! – plalex

1

L'identification des dictionnaires avec une entrée supplémentaire, comme vous le suggérez, est une idée viable:

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

et plus tard

self.list_cfg[:] = [d for d in self.list_cfg if d.get('id') != 'dico_cfg'] 

Notez que je cède au complet tranche de liste (la syntaxe [:]), pas à la liste na moi - ce dernier peut donner l'impression de travailler parfois, mais il ne modifie pas l'objet liste (juste un nom), donc s'il y a d'autres références à l'objet liste, elles ne seront pas modifiées. Quoi qu'il en soit, attribuer au nom (au lieu de la [:]) n'a aucun avantage à moins que vous voulez garder l'objet original non modifié par d'autres références.

Questions connexes