#python
#python
Вопрос:
У меня есть несколько вопросов в текстовом файле, которые я хочу прочитать один за другим. Текстовый файл представляет собой вопросы для чтения, помещенные в список. После обсуждения первого отображаемого вопроса программа должна позволить мне перейти к следующему. Вопросы должны приходить случайным образом.
Теперь у меня есть этот скрипт, который выполняет эту работу, но каждый раз мне приходится запускать программу, как будто я запускаю ее в первый раз.
Ниже приведен мой код:
import random
with open('questions.txt', 'r') as f:
text = f.read()
list_of_qns = text.splitlines()
if len(list_of_qns) != 0:
question = random.choice(list_of_qns)
print(question)
list_of_qns.remove(question)
Пожалуйста, помогите мне заставить его запускать по одному вопросу за раз, не завершая его, если в списке все еще есть какие-то вопросы. Пожалуйста, также обратите внимание, что я удаляю вопрос, с которым мы закончили, чтобы предотвратить его отображение более одного в одном запуске.
Комментарии:
1. итак, вы хотите разные случайные вопросы?
2. Да, и случайным образом, не так, как упорядочено в файле
3. и программа должна завершиться, когда будут отображены все вопросы
4. ваша идея довольно приличная. Проблема в том, что «делать что-то снова и снова, пока список не опустеет» должно напоминать вам о функциональном блоке для использования вместо
if
. (ps, подумайте о циклах.)
Ответ №1:
Вы можете использовать random.shuffle, который перетасует ваш список вопросов по местам.
Кроме того, вы можете использовать readlines
для чтения вашего файла непосредственно в виде списка строк, вместо того, чтобы читать его и разбивать позже.
import random
with open('questions.txt', 'r') as f:
questions = f.readlines()
random.shuffle(questions)
for question in questions:
print(question)
Если вы хотите задать несколько сеансов вопросов, вы могли бы определить функцию:
def ask_all_questions:
random.shuffle(questions)
for question in questions:
print(question)
Каждый раз, когда вы вызываете его, все вопросы будут задаваться снова, каждый раз в случайном порядке.
Ответ №2:
Вы можете попробовать это:
import random
with open('questions.txt', 'r') as f:
text = f.read()
list_of_qns = list(filter(None, text.splitlines()))
while list_of_qns:
question = random.choice(list_of_qns)
print(question)
input()
list_of_qns.remove(question)
Нажмите клавишу Enter, чтобы перейти к следующему вопросу.
Ответ №3:
Используйте while вместо if:
import random
with open('questions.txt', 'r') as f:
text = f.read()
list_of_qns = text.splitlines()
while len(list_of_qns) != 0:
question = random.choice(list_of_qns)
print(question)
list_of_qns.remove(question)
While позволяет выполнять цикл до тех пор, пока условие больше не будет выполнено.
Для пользовательского ввода вы могли бы использовать что-то вроде:
inp = input()
Комментарии:
1. это приведет к изменению исходного списка
2. @David Я пытался использовать цикл while, но это отображает все вопросы сразу. Я даже пытался использовать функции iter () и next (), но все безрезультатно
3.
set_of_q = set(list_of_qns)
а затем выполнить итерацию? aslist.remove()
удалит только один уникальный элемент4. @Ruturaj Пожалуйста, обратите внимание, что у меня есть отдельные вопросы в файле. Но поскольку я использую random module, вот почему я сказал, что не хочу, чтобы вопрос повторялся.
Ответ №4:
import random
# reads questions text
with open('questions.txt', 'r') as f:
text = f.read()
# converts into text format
list_of_qns = text.splitlines()
# length of list_of_questions
number_of_questions = len(list_of_questions)
# create dcitionary to check question printed or not
dict_of_questions_printed = dict()
# for not printed question mark intially as 1
for question in list_of_qns:
dict_of_questions_printed[question] = 1
# loop until number_of_questions is not equal to 0
while number_of_questions != 0:
# select random question
question = random.choice(list_of_qns)
# checks if question is printed or value in dictionary is 0 continues
if not dict_of_questions_printed[question]:
continue
# else prints question, marks dictionary value of question to 0 and
# decrements number of question
print(question)
dict_of_questions_printed[question] = 0
number_of_question -= 1
continue