2
votes

Comment choisir une question aléatoire parmi les éléments d'une liste / dict importée depuis un fichier CSV?

Je dois coder un quiz comme un devoir. La toute dernière étape implique que je sélectionne au hasard l'ordre dans lequel les questions sont posées.

Je ne sais pas comment faire cela, car je ne suis pas sûr à 100% du fonctionnement de mon code existant - s'il faut le choisir dans le Fichier CSV lui-même ou à partir de la liste / dict (est-ce une liste ou un dictionnaire?).

score=0
questionno=0
def parse_csv(file_name: str) -> dict:
    retval = {}
    with open(file_name) as f:
        for line in f:
            data = line.strip().split(',')
            key, *values = (v.strip() for v in data)
            retval[key] = values
    return retval

questions = parse_csv('questions.txt')
for question, answers in questions.items():
    questionno+=1
    correct = answers[-1]
    answers = answers[:-1]
    print(questionno)
    result = input(f"{question}: {','.join(answers)}")
    if result=="A" or result=="B" or result=="C" or result=="D":
        if result == correct:
            print('Correct!')
            score+=1
        else:
            print(f'The correct answer is {correct!r}')
            break
    else:
        print("Invalid Entry")
        break

print(score)


2 commentaires

Si vous l'avez codé, comment ne savez-vous pas comment cela fonctionne? Aussi pour que nous ayons une meilleure compréhension des données que vous lisez, veuillez fournir le contenu ou un échantillon de celui-ci pour 'questions.txt'


@Jab Non, je n'ai pas codé la majeure partie de cela. La tâche d'extension consistait à développer le code existant


3 Réponses :


0
votes

De par leur conception, les dictionnaires en Python n'ont aucun ordre (voir OrderedDict pour cela), mais lorsque vous le parcourez, l'ordre n'est pas vraiment aléatoire non plus!

Voici ce que je suggère pour rendre l'ordre des questions vraiment aléatoire:

from random import shuffle


questions = parse_csv('questions.txt')
shuffledquestions = list(questions.items())
shuffle(shuffledquestions)
for (question, answer) in shuffledquestions:
    questionno+=1
    correct = answers[-1]
    answers = answers[:-1]
    print(questionno)
    result = input(f"{question}: {','.join(answers)}")
    if result=="A" or result=="B" or result=="C" or result=="D":
        if result == correct:
            print('Correct!')
            score+=1
        else:
            print(f'The correct answer is {correct!r}')
            break
    else:
        print("Invalid Entry")
        break


7 commentaires

Je vous remercie! Question, cependant: je pensais que c'était un dictionnaire? Alors pourquoi le shuffle (liste (etc?


J'ai modifié ma réponse pour que ce soit clair, vous ne pouvez pas directement mélanger un dictionnaire, faisons-nous une liste des questions et mélangeons cette liste à la place


Désolé, ça ne marche pas. Il dit que l'objet "NoneType" n'est pas itérable, en ce qui concerne la ligne pour question dans les questions mélangées:


oups mon mauvais, la lecture aléatoire ne renvoie pas une nouvelle liste, alors j'ai à nouveau modifié mon code, pouvez-vous vérifier maintenant?


Il renvoie avec ce message d'erreur: Fichier "/Library/Frameworks/Python.framework/Versions/3.7/lib/pytho‌ n3.7 / random.py", ligne 275, en aléatoire pour i en inversé (range (1, len (x))): TypeError: l'objet de type 'NoneType' n'a pas de len () >>>


Eh bien, il semble qu'un objet NoneType a été passé à la fonction shuffle (), ce n'est pas lié à mon code, je l'ai testé et cela fonctionne


Oh non désolé, c'était juste une faute de frappe haha! Cela fonctionne, merci beaucoup!



0
votes

C'est un dictionnaire. Vous pouvez utiliser numpy.random.shuffle après avoir converti le dictionnaire en liste de tuples comme ceci:

import numpy as np

questions = list(parse_csv('questions.txt').items())
np.random.shuffle(questions)
for question, answers in questions:
    ...


0 commentaires

0
votes

Vous pouvez poser à nouveau la question si l'utilisateur entre une entrée non valide - Cela mélange également la commande.

import random
score=0
questionno=0
def parse_csv(file_name: str) -> dict:
    retval = {}
    with open(file_name) as f:
        for line in f:
            data = line.strip().split(',')
            key, *values = (v.strip() for v in data)
            retval[key] = values
    return retval
questions = parse_csv('questions.txt')
l = list(questions.items())
random.shuffle(l)
questions = dict(l)
for question, answers in questions.items():
    questionno+=1
    correct = answers[-1]
    answers = answers[:-1]
    while True:    
        result = input(f"{question}: {','.join(answers)}")
        if result=="A" or result=="B" or result=="C" or result=="D":
            if result == correct:
                print('Correct!')
                score+=1
                break
            else:
                print(f'The correct answer is {correct!r}')
                break
        else:
            print("Invalid Entry\n Try again...")


0 commentaires