-1
votes

Comment puis-je passer à la prochaine entrée si une clé n'existe pas dans DICK

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 C est manquante: xxx

mon code actuel xxx < P> En ce moment, je reçois l'erreur:

pour (next_v, d) dans graphique [Vertex] .items (): KeyError: 'c'

EDIT 1

Si la clé ne se trouve pas dans dict sautant.

< Strong> Edit 2

Même avec le code nouvellement ajouté, je reçois une erreur, cette fois: (Distance, sommet, chemin) = heepq.heappop (file d'attente) IndexError: Index hors de portée


voici le fichier de données que j'utilise

https://s3-eu-west-.amazonaws.com/citymapper-assets/citymapper-coding-test-graph.dat < / a>

voici le format de fichier: xxx

et voici le code pour créer le graphique xxx

Changer Démarrez et fin à: xxx

Toute aide / conseil est très apprécié. Merci


3 commentaires

Si le sommet n'est pas dans le graphique: Continuer


ESSAYER / SAUF KEYERROR ou IF C IN G


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.


3 Réponses :


1
votes

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


10 commentaires

Votre solution se termine dans l'erreur suivante: (distance, sommet, chemin) = hePQ.Heappop (file d'attente) IndexError: Index hors de portée


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 et d ? 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 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 est nécessaire dans le si vertex == fin branche?


J'ai ajouté un pause et cela a fonctionné. Postez votre code mis à jour avec le Break .


Votre exemple de code fonctionne pour moi, sauf que j'ai renommé g à graphique et j'ai ajouté importer tasqq .


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.



1
votes

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


1 commentaires

La solution se termine dans l'erreur suivante: (distance, sommet, chemin) = heaphq.heappop (file d'attente) IndexError: Index hors de portée



1
votes

Vous pouvez faire un .get et renvoyer un vide (code> {} incase la clé n'est pas là, de sorte que le .items () ne cassera pas comme, xxx


1 commentaires

La solution se termine dans l'erreur suivante: (distance, sommet, chemin) = heaphq.heappop (file d'attente) IndexError: Index hors de portée