-1
votes

suppression de clés et de valeurs d'un dictionnaire imbriqué

Je suis relativement nouveau dans la programmation et je suis assez coincé.

J'ai un dictionnaire comme celui-ci ci-dessous. Je veux dire comme n = "a" alors je veux supprimer chaque variable n du dictionnaire.

Ensuite, je veux supprimer chaque lettre a qui se trouve dans ce dictionnaire imbriqué ci-dessous. Je sais comment supprimer des éléments des dictionnaires dans une toute petite mesure, mais je suis assez confus pour le moment car je ne sais pas comment le faire avec un dictionnaire imbriqué. Dans ce cas, il y a une clé, puis une valeur, mais à l'intérieur de la valeur se trouve un autre dictionnaire avec d'autres clés et valeurs. J'ai implémenté des boucles for, etc. pour essayer de faire ce que je veux faire, mais la solution que j'obtiens n'est pas ce que je recherche.

Merci:)

n = "b"

for k in dic.keys():
    if k == n:
        del dic[k]

C'est ce que j'ai jusqu'à présent, mais il s'agit simplement de supprimer le premier b qui est une clé, comment accéder aux b dans le dictionnaire imbriqué

dic = {'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

et chaque fois que je fais quelque chose comme:

n = "b"

del dic[n]

print(dic)

et chaque fois que je fais quelque chose comme:

{'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

dic = {'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

il apparaît dans le terminal que RuntimeError: dictionary a changé de taille pendant l'itération


5 commentaires

Veuillez répéter sur le sujet et comment demander à partir de la visite d'introduction . "Montre-moi comment résoudre ce problème de codage?" est hors sujet pour Stack Overflow. Vous devez tenter honnêtement de trouver la solution, puis poser une question spécifique sur votre implémentation. Stack Overflow n'est pas destiné à remplacer les didacticiels et la documentation existants.


désolé je n'ai pas réalisé que je devais inclure mon code, je le ferai la prochaine fois désolé @Prune


quelle est la sortie attendue du code ci-dessus?


Pourquoi ne pas le faire cette fois? Parcourez la visite d'introduction (comme vous auriez dû le faire déjà) et suivez les instructions de publication. Donnez-nous le MRE attendu, et nous pouvons vous aider.


@Onyambu mon code en ce moment supprime simplement n = "b", et pour le moment je sais juste comment récupérer la clé, je ne sais pas comment accéder à cette valeur dans ce dictionnaire imbriqué qui contient aussi des valeurs et des dictionnaires


3 Réponses :


0
votes

En supposant que vous souhaitiez convertir le dictionnaire en matrice, vous pouvez le faire comme suit:

{'b': {'a': 7, 'c': 10, 'd': 15}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

Cela fournira la sortie suivante:

def delete_key(keys: list):

    dictionary = {
        'b': {'a': 7, 'c': 10, 'd': 15},
        'a': {'b': 7, 'c': 9, 'f': 14},
        'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2},
        'f': {'a': 14, 'c': 2, 'e': 9},
        'd': {'b': 15, 'c': 11, 'e': 6},
        'e': {'d': 6, 'f': 9}
    }

    
    for i in keys:
        dictionary.pop(i)
        
    return dictionary
    
print (delete_key(keys=['a', 'c']))

Avec des indices de matrice correspondant aux valeurs de clé internes (a à f), c'est pourquoi la matrice a des zéros là où une valeur n'existe pas à une clé spécifique.

Alternativement, si vous voulez juste vous débarrasser des clés principales, vous devez simplement utiliser keys_removed = [dictionary.get(i) for i in dictionary] et le convertir à partir d'une liste. Cela vous donnera les éléments suivants:

[{'a': 7, 'c': 10, 'd': 15}, {'b': 7, 'c': 9, 'f': 14}, {'a': 9, 'b': 10, 'd': 11, 'f': 2}, {'a': 14, 'c': 2, 'e': 9}, {'b': 15, 'c': 11, 'e': 6}, {'d': 6, 'f': 9}]

ÉDITER

Si vous souhaitez supprimer certaines clés et leurs entrées correspondantes, vous pouvez faire quelque chose comme ceci:

[[ 7.  0. 10. 15.  0.  0.]
 [ 0.  7.  9.  0.  0. 14.]
 [ 9. 10.  0. 11.  0.  2.]
 [14.  0.  2.  0.  9.  0.]
 [ 0. 15. 11.  0.  6.  0.]
 [ 0.  0.  0.  6.  0.  9.]]

Cela prend une liste de clés que vous souhaitez supprimer et renvoie un nouveau dictionnaire sans elles. Les sorties de cas ci-dessus:

from sklearn.feature_extraction import DictVectorizer

dictionary = {
    'b': {'a': 7, 'c': 10, 'd': 15},
    'a': {'b': 7, 'c': 9, 'f': 14},
    'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2},
    'f': {'a': 14, 'c': 2, 'e': 9},
    'd': {'b': 15, 'c': 11, 'e': 6},
    'e': {'d': 6, 'f': 9}
}


keys_removed = [dictionary.get(i) for i in dictionary]

dictvectorizer = DictVectorizer(sparse=False)
matrix = dictvectorizer.fit_transform(keys_removed)


4 commentaires

Salut merci beaucoup pour votre réponse :) Je l'apprécie beaucoup merci. Mais ce que j'essaie d'obtenir mon code, c'est de supprimer toutes les instances d'une lettre que je souhaite supprimer du dictionnaire. J'ai essayé ci-dessus certaines méthodes, mais je suis relativement nouveau dans la programmation et je ne peux pas comprendre où je me trompe. Merci


J'ai fait une modification qui, je pense, devrait fonctionner.


Vous remarquez que votre dictionnaire contient encore des valeurs clés 'a'. Vous devez également les supprimer.


Je viens de lire la modification la plus récente de la question et je suis d'accord. Au départ, il n'y avait aucune référence aux clés à supprimer. Ajout d'une autre réponse maintenant. Merci pour l'information.



1
votes

Vous pouvez écrire une fonction récursive:

def delete_key(k, dic):
  if k in dic:
      del dic[k]
  for val in dic.values():
    if isinstance(val, dict):
       delete_key(k, val)
  return dic

d = {'b': {'a': 7, 'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2}, 'f': {'a': 14, 'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

delete_key('b', d)

{'a': {'c': 9, 'f': 14},
 'c': {'a': 9, 'd': 11, 'f': 2},
 'd': {'c': 11, 'e': 6},
 'e': {'d': 6, 'f': 9},
 'f': {'a': 14, 'c': 2, 'e': 9}}


2 commentaires

Quelques améliorations mineures: Vous pouvez simplement faire if k in dic car c'est la même chose que if k in dic.keys() . Pour la boucle, for val in dic.values() aurait plus de sens, car vous n'utilisez pas key . De plus, il n'y a aucune raison de return dic .


salut merci pour votre aide :) c'est exactement ce que je voulais mais pour la partie récursive, cela ne fonctionne pas avec mon code car ma fonction delete_key n'a qu'à prendre la variable k j'ai essayé de l'alterner pour mon code mais il continue de dire que le rayon de récursivité est dépassé



0
votes

Selon vos récentes clarifications, cela devrait fonctionner:

{'b': {'c': 10, 'd': 15}, 'a': {'b': 7, 'c': 9, 'f': 14}, 'c': {'b': 10, 'd': 11, 'f': 2}, 'f': {'c': 2, 'e': 9}, 'd': {'b': 15, 'c': 11, 'e': 6}, 'e': {'d': 6, 'f': 9}}

La fonction fonctionne comme suit:

  • Il vous permet de spécifier les clés (et les entrées correspondantes) que vous souhaitez supprimer. Vous outer_keys simplement lesquels dans les outer_keys ou inner_keys , ces dernières étant les clés les plus profondes du dictionnaire imbriqué.
  • Celles-ci doivent être définies comme une liste des noms de clé et peuvent être vides si vous souhaitez uniquement supprimer les clés de l'intérieur ou de l'extérieur.

L'exemple ci-dessus affichera les éléments suivants:

def delete_key(outer_keys: list, inner_keys: list):

    dictionary = {
        'b': {'a': 7, 'c': 10, 'd': 15},
        'a': {'b': 7, 'c': 9, 'f': 14},
        'c': {'a': 9, 'b': 10, 'd': 11, 'f': 2},
        'f': {'a': 14, 'c': 2, 'e': 9},
        'd': {'b': 15, 'c': 11, 'e': 6},
        'e': {'d': 6, 'f': 9}
    }

    
    for i in outer_keys:
        dictionary.pop(i)
        
    for i in dictionary:
        for j in inner_keys:
            if j in dictionary[i]:
                dictionary[i].pop(j)
        
    return dictionary
    
print (delete_key(outer_keys=[], inner_keys=['a']))

Vous remarquerez que toutes les touches internes «a» ont été supprimées. L'opération peut être effectuée en utilisant moins de boucles, mais cela devrait illustrer suffisamment bien le processus.


0 commentaires