【问题标题】:Python 3 - Randomly printing items from list of dictionaries without repeatPython 3 - 从字典列表中随机打印项目而不重复
【发布时间】:2018-04-30 13:56:17
【问题描述】:

我有一些我在测验中使用的代码的修改版本,我的问题是我的代码正在使用 random.choice 来选择一个测验问题,我如何让它仍然随机选择一个问题但也不重复一个问题已经向用户询问过?

对“quiz_data”中奇怪的问题和答案表示歉意

代码:

def InformationToDictionaries():
quiz_data = [
    {
        "question": "What day is it today?",
        "choices": {"a": "Monday", "b": "Friday", "c": "Wednesday", "d": "Sunday"},
        "answer": "Wednesday")
    },
    {
        "question": "What food am I thinking of?",
        "choices": "Pizza", "b": "Curry", "c": "Pie", "d": "Pasta"},
        "answer": "Curry"
    }
]
return quiz_data


def Quiz():
    score = 0
    for i in range(1,6):
        q = random.choice(quiz_data)
        print("Q." + str(i) + ": ", q.get("question"))
        print('\n'.join("{}: {}".format(x, y) for x, y in q.get("choices").items()))
        userans = str(input("\n>"))

    if userans == q.get("answer"):
        print("Correct")
        score = score + 1
    else: print("Incorrect")

quiz_data = InformationToDictionaries()
Quiz()

非常感谢您提前回复,如果您对我有任何建议,请告诉我,这是我的第一个问题。

--------编辑1---------

第一次建议后修改代码:

def Quiz():
score = 0
random.shuffle(quiz_data)
for question in quiz_data:
    q = random.choice(quiz_data)
    print("Q." + str("1") + ": ", q.get("question"))
    print('\n'.join("{}: {}".format(x, y) for x, y in q.get("choices").items()))

【问题讨论】:

  • quiz_data(顶部的那个)是一个列表,而不是字典。您可以随机播放该列表并按顺序回答问题,以确保不会重复。
  • @BilltheLizard 所以我使用 random.shuffle?然后按顺序打印项目?我的问题是我仍然想按随机顺序提问。
  • 是的,在循环之前打乱它们,然后在循环内打印它们(摆脱对random.choice的调用)。
  • @BilltheLizard as Joaquim Ferrer 也提到我已经尝试过这种方法,虽然发现问题确实是随机顺序的,但我仍然得到重复?
  • 请贴出您现在正在使用的代码。

标签: python python-3.x list dictionary random


【解决方案1】:

有几种方法。就像在使用后从列表中删除问题一样,或者随机排列数组并遍历它。

要在每次选择问题时从数组中删除所有问题:

while(len(quiz_data) != 0):
  q = random.choice(quiz_data)
  quiz_data.remove(q)
  #do stuff with q

如果你想遍历一个打乱的数组:

from random import shuffle
shuffle(quiz_data)
for question in quiz_data:
  pass #this is only here for the code to run
  #do stuff with question

这两种方式都会以随机顺序为您提供所有问题

【讨论】:

    【解决方案2】:

    在您修改后的代码中,您仍在循环中选择一个随机问题。如果你去掉 q = random.choice(quiz_data) 行并在循环体中使用 question 变量,你可以按照打乱的顺序来处理它们。

    score = 0
    random.shuffle(quiz_data)
    for question in quiz_data:
        print("Q." + str("1") + ": ", question.get("question"))
        print('\n'.join("{}: {}".format(x, y) for x, y in question.get("choices").items()))
    

    【讨论】:

    • 不客气。我看到我会改变的另一件事是它总是打印 'Q.1:"。您可以将其更改为计数器来代替 str("1")
    • 是的,它只是一个占位符,所以代码可以运行,不过我还有另一个问题,如果问题选择也按随机顺序排列会很困难,我很欣赏这些选择分配给字典中的a,b,c等我只是想知道是否有一个简单的解决方案?提前致谢
    • @G.W 如果您将choices 更改为列表而不是quiz_data 中的字典,您也可以随机播放。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    相关资源
    最近更新 更多