2017-07-24 1 views
1
item = word_bank.pop(random.choice(list(word_bank.keys()))) 
print(list(word_bank.keys())) 
print("The Word is: ", item) 
print("=" * 25) 
a = input("Do You Know It? (y/n):\t") 
answer = word_bank[item] 

La variable item ci-dessus renvoie des valeurs à la place des clés de mon dictionnaire word_bank. J'ai imprimé ma liste de clés pour essayer de déboguer le problème et aucune valeur n'existe, ce qui me fait penser que le problème existe avec la méthode pop ou la méthode random.choice. J'ai regardé à la fois dans la documentation pour ces derniers et n'a rien trouvé qui soulignerait le problème.pop aléatoire à partir de dict, servant des valeurs, pas des clés

Je pense qu'il a quelque chose à voir avec random.choices renvoyant un index à une clé, puis la méthode pop renvoyant la valeur correspondante à cette clé en tant qu'élément. Cependant, lorsque j'inverse les rôles et que j'utilise values() à la place de keys(), j'obtiens une erreur de clé et je n'arrive pas à trouver de solution au problème.

Quelqu'un pourrait-il nous éclairer à ce sujet et m'aider à trouver le moyen le plus efficace de le faire?

+2

* ... aucune valeur n'existe *, savez-vous ce que 'dict.pop' fait? –

+0

Qu'essayez-vous exactement de faire? Oui, si vous passez une clé à la méthode '.pop', elle * apparaît * la valeur correspondante ... –

Répondre

0

Le fichier word_bank.keys() renvoie évidemment les clés, le cas échéant. word_bank.pop retournera la valeur de la clé donnée. Ainsi, item contiendra une valeur de word_bank. Cependant, lorsque j'inverse les rôles et utilise les valeurs() à la place de keys(), j'obtiens une erreur de clé, parce que vous essayez de rechercher des clés en utilisant des valeurs. Un dictionnaire peut directement être indexé uniquement par clé et non par valeur. Vérifiez ceci:

word_bank = {'one':1,'two':2,'three':3} 
item = word_bank.pop(random.choice(list(word_bank.keys()))) 
print(list(word_bank.keys())) 
print("The Word is: ", item) 
print("=" * 25) 
a = input("Do You Know It? (y/n):\t") 
answer = item 
0
word_bank = {'hello':'goodbye','yes':'no'}  

      item = random.choice(list(word_bank.items())) 
       key = item[0] 
       value = item[1] 
       print("The Word is: ", key) 
       print("=" * 25) 
       a = input("Do You Know It? (y/n):\t") 
       answer = value 
      if a.lower() == "y": 
        print() 
        print("Answer:\t", answer) 
        score += 1 
        del word_bank[key]   #remove from dict 
        print() 
      elif a.lower() == "n": 
        print() 
        print("Answer:\t", answer) 
        del word_bank[key]   #remove from dict 
        print() 

je suis venu avec cette solution, mais il ne semble pas très efficace, quelqu'un pourrait-il fournir un moyen de itérer à travers mon destructive dictionnaire qui utilise moins en ligne ou fournit plus de lisibilité? Mon intuition dit pop, mais cela ne fonctionne qu'avec des clés et non des valeurs, j'ai besoin d'enlever et de renvoyer une clé à l'utilisateur puis lui montrer la valeur. L'exemple ci-dessus fonctionne, mais semble volumineux.

+0

Donc vous donnez un point à quelqu'un si vous prétendez connaître la réponse même sans vérifier la réponse? –

+0

le programme est pour mon usage seulement, je cours à travers un dictionnaire de mots dans une langue différente, les clés étant la langue étrangère et les valeurs étant des définitions anglaises. C'est pour mon usage seulement, ainsi vérifier une réponse n'est vraiment pas un problème en ce moment. – GainesvilleJesus

+0

pourquoi destructivement? Répondez-vous seulement à une partie et faites-vous quelque chose avec le reste? – cmd

0

une clé choisir au hasard puis pop() la réponse:

import random 

word_bank = {'hello':'goodbye','yes':'no'} 
score = 0 
item = random.choice(list(word_bank.keys())) 
answer = word_bank.pop(item) 
print("The Word is: ", item) 
print("=" * 25) 
a = input("Do You Know It? (y/n):\t") 
if a.lower() == "y": score += 1 
print() 
print("Answer:\t", answer) 

Le code ci-dessus mute le dictionnaire à chaque étape. Que faire si, par exemple, vous voulez exécuter le quiz à nouveau? Je n'aime pas détruire l'information sans raison. Voici une version non destructive d'un test tout ce qui brouille les clés, ce qui donne donc des ordres différents sur différentes pistes (notez que je dispense la answer variables puisque je ne avais besoin de la valeur dans une ligne de code):

import random 

word_bank = {'hello':'goodbye','yes':'no'} 
score = 0 
questions = list(word_bank.keys()) 
random.shuffle(questions) 
for item in questions: 
    print("The Word is: ", item) 
    print("=" * 25) 
    a = input("Do You Know It? (y/n):\t") 
    if a.lower() == "y": score += 1 
    print() 
    print("Answer:\t", word_bank[item]) 

print("Final score =",score)