2017-08-12 4 views
2

J'ai un simple code qui ne fonctionne pas et je n'arrive pas à comprendre pourquoi.Les boucles for-in Pythonic imbriquées super simples ne fonctionnent pas correctement ... quelque chose à voir avec les entrées

Le code est le suivant:

def myFunction(otherDictionary, mongoDbCollection): 

    for p in otherDictionary: 

     print('hi') 

     for d in mongoDbCollection: 

      print('hello') 

Il est évident que l'objectif final n'est pas l'impression d'un groupe de son salut et bonjour de mais a fait cela uniquement pour des fins de débogage quand il semblait que le mécanisme de bouclage ne fonctionnait pas correctement.

Lorsque j'appelle cette fonction à mon grand désarroi, un seul hi est imprimé, puis tous les hello s, suivis par le reste des hi s. Ou quelque chose comme ceci:

hi 
hello 
hello 
hello 
hello 
hi 
hi 
hi 
hi 

plutôt que:

hi 
hello 
hello 
hello 
hello 
hi 
hello 
hello 
hello 
hello 

et ainsi de suite .....

Il a certainement quelque chose à voir avec les entrées de la fonction que lorsque je l'ai changé otherDictionary & mongoDbCollection chacun à [1,2,3,4,5] pour déboguer ce problème, il a imprimé les salut et salut comme prévu.

Que pourrait-il y avoir dans les entrées qui causeraient un tel problème?

mongoDbCollection = une collection de ma base de données de mongo

otherDictionary est juste un dictionnaire simple avec des mots-clés et compte respectifs pour chacun comme ceci:

{ 'randomKey': 10, 'otherRandomKey': 3, 'evenMoreRandomKey': 14 } 

pourrait caractères/symboles étranges dans de la clé être à l'origine d'une erreur comme ça?

Je suis complètement perplexe! Le code est trop simple pour qu'il ne soit pas travailler ...

+1

Y at-il de toute façon un exemple reproductible? Et non, "caractères étranges/symboles dans les touches" ne pouvait pas être à l'origine de cela. –

+1

En outre, quoi, ** exactement ** est votre objet 'mongoDbCollection'? –

+0

l'objet mongoDbCollection est juste un tas de dictionnaires empilés comme ceci {key: val, key: val}, {key: val, key: val} – learningToCode54321

Répondre

3

Je ne me MongoDB, donc je pourrais être complètement à côté ici, mais:

Est-il possible mongoDbCollection est un générateur? Les générateurs ne peuvent être itérés qu'une seule fois. La deuxième fois que vous essayez d'itérer sur elle, il ne serait pas capable de le faire et ce serait fondamentalement un iterable vide.

Cela causerait un comportement similaire à ce que vous avez fait preuve dans votre question: la "hi" initiale serait imprimé une fois, la mongoDbCollection serait itérés l'impression "hello"x nombre de fois, puis "hi" seront imprimés pour le reste de la première pour la boucle.

Il ressemblerait à quelque chose comme ceci:

hi 
hello 
hello 
hello 
# "hello" however many times are in mongoDbCollection ... 
hi 
hi 
hi 
# "hi" however many times are in otherDictionary ... 

Pour résoudre ce problème, vous devez créer un objet qui pourrait être itéré une quantité infinie de temps (par exemple, une liste ou un dict, quel que soit le plus étroitement correspond à mongoDbCollection).

def myFunction(otherDictionary, mongoDbCollection): 
    collection = list(mongoDbCollection) # or use dict or some other iterable object 
    for p in otherDictionary: 
     print('hi') 
     for d in collection: 
      print('hello') 
+0

C'est exactement ce que c'était! – learningToCode54321

+2

@ learningToCode54321 Donc, la séquence des impressions 'salut' et 'bonjour' dans votre question n'était pas ce qui était réellement imprimé? Comme je l'ai mentionné dans mon autre commentaire, la séquence dans votre question était impossible même si 'mongoDbCollection' est une collection. –