J'ai un dict de dicts, mais une entrée donnée pourrait ne pas exister. Par exemple, j'ai le dict suivant où l'entrée de mon code actuel p> Si la clé ne se trouve pas dans dict sautant. P> < Strong> Edit 2 Strong> P> Même avec le code nouvellement ajouté, je reçois une erreur, cette fois:
voici le fichier de données que j'utilise p> C code> est manquante: pour (next_v, d) dans graphique [Vertex] .items ():
KeyError: 'c' code> p>
(Distance, sommet, chemin) = heepq.heappop (file d'attente)
IndexError: Index hors de portée
code> p>
3 Réponses :
Avant d'accéder au graphique [Vertex] code>, assurez-vous qu'il est dans la dicte: if vertex not in graph:
continue
for (next_v, d) in graph[vertex].items():
heapq.heappush(queue, (distance + d, next_v, path))
Votre solution se termine dans l'erreur suivante: (distance, sommet, chemin) = hePQ.Heappop (file d'attente) IndexError: Index hors de portée code>
Si le sommet n'est pas présent dans le graphique, que devriez-vous faire? Appuyez de toute façon sur la file d'attente, en utilisant des valeurs par défaut pour next_v code> et d code>? Je ne connais pas votre candidature, je ne peux donc pas répondre à cette question pour vous.
Passer cette clé et aller à la suivante. Toutes les solutions données doivent fonctionner.
Le tandis que la boucle code> VRAI n'a aucun moyen de se terminer. Ainsi, après la découverte d'une solution, il essaie toujours de faire apparaître un tas vide. Peut-être qu'un casse code> est nécessaire dans le si vertex == fin code> branche?
J'ai ajouté un pause code> et cela a fonctionné. Postez votre code mis à jour avec le Break code>.
Votre exemple de code fonctionne pour moi, sauf que j'ai renommé g code> à graphique code> et j'ai ajouté importer tasqq code>.
Votre code n'a également aucun moyen de quitter la boucle si le chemin souhaité ne peut pas être trouvé. Êtes-vous sûr que le fichier de données contient une solution?
Le résultat basé sur les deux identifiants indiqués devrait être de 2709 pour la distance.
En utilisant le petit graphique de données, votre code d'échantillon posté fonctionne avec les modifications données. Je ne suis pas sûr que quiconque soit prêt à creuser à travers cet énorme jeu de données pour trouver le problème. Peut-être que vous pourriez poster une version (beaucoup) plus petite de cet ensemble de données qui démontre le problème.
Je ne suis pas sûr à ce moment-là. Je vais essayer une approche différente. Merci John.
Vous pouvez vérifier si le sommet est dans le graphique avant d'exécuter cette finale pour la boucle:
if vertex in graph:
for (next_v, d) in graph[vertex].items():
heapq.heappush(queue, (distance + d, next_v, path))
La solution se termine dans l'erreur suivante: (distance, sommet, chemin) = heaphq.heappop (file d'attente) IndexError: Index hors de portée code>
Vous pouvez faire un .get code> et renvoyer un vide (code> {} code> incase la clé n'est pas là, de sorte que le .items () code> ne cassera pas comme,
La solution se termine dans l'erreur suivante: (distance, sommet, chemin) = heaphq.heappop (file d'attente) IndexError: Index hors de portée code>
Si le sommet n'est pas dans le graphique: Continuer Code>ESSAYER / SAUF KEYERROR CODE> ouIF C IN G CODE>Je suppose que le fait que la clé énumérée dans le sous-dictionnaire vous fait sauter n'importe où dans le dictionnaire. Donc, le seul moyen d'éviter ce scénario pour nettoyer le dictionnaire à l'avance.