Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从CSV文件导入的列表/目录中的项目中选择随机问题?_Python_Python 3.x - Fatal编程技术网

Python 如何从CSV文件导入的列表/目录中的项目中选择随机问题?

Python 如何从CSV文件导入的列表/目录中的项目中选择随机问题?,python,python-3.x,Python,Python 3.x,我必须把一个小测验作为家庭作业。最后一步是我将问题的提问顺序随机化 我不知道如何做到这一点,因为我甚至不能100%确定我现有的代码是如何工作的——是从CSV文件本身还是从列表/目录(是列表还是词典?)中选择它 根据设计,Python中的字典没有任何顺序(请参阅),但是当您对其进行迭代时,顺序也不是真正随机的 我建议将问题顺序设置为真正随机的: 来自随机导入洗牌 questions=parse_csv('questions.txt') shuffledquestions=列表(questions.

我必须把一个小测验作为家庭作业。最后一步是我将问题的提问顺序随机化

我不知道如何做到这一点,因为我甚至不能100%确定我现有的代码是如何工作的——是从CSV文件本身还是从列表/目录(是列表还是词典?)中选择它


根据设计,Python中的字典没有任何顺序(请参阅),但是当您对其进行迭代时,顺序也不是真正随机的

我建议将问题顺序设置为真正随机的:

来自随机导入洗牌
questions=parse_csv('questions.txt')
shuffledquestions=列表(questions.items())
洗牌(洗牌问题)
对于随机问题中的(问题,答案):
问题编号+=1
正确=答案[-1]
答案=答案[:-1]
打印(问题编号)
结果=输入(f“{问题}:{,'.join(答案)}”)
如果结果==“A”或结果==“B”或结果==“C”或结果==“D”:
如果结果==正确:
打印('正确!')
分数+=1
其他:
打印(f'正确答案为{correct!r}')
打破
其他:
打印(“无效条目”)
打破
其思想是制作一个(问题、答案)元组列表,使用洗牌,然后对其进行迭代


编辑:我忘记了shuffle()已经就位,并且没有返回列表,现在它应该可以工作了,它是一本字典。您可以在将字典转换为元组列表后使用,如下所示:

import numpy as np

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

如果用户输入了无效的条目,您可以再次询问该问题-同时它会洗牌顺序

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

如果您对其进行编码,您如何不确定其工作原理?另外,为了让我们更好地了解您正在阅读的数据,请提供
'questions.txt'
@Jab不,我没有对大部分内容进行编码。扩展任务是扩展现有代码谢谢!但问题是:我还以为这是一本字典呢?那为什么要乱序呢?我编辑了我的答案,让它更清楚,你不能直接乱序一个单词,所以我们列一个问题的列表,然后乱序这个列表。对不起,它不起作用。上面写着“非类型”对象不可编辑,关于shuffledquestions中的问题行:糟糕,shuffle没有返回新列表,因此我再次编辑了代码,您现在可以检查吗?它返回以下错误消息:File“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/random.py”,第275行,shuffle for I in reversed(范围)(1,len(x)):TypeError:类型为“NoneType”的对象没有len()>>>
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...")