Как отображать по одному элементу за раз из списка, не повторяя один и тот же элемент в Python

#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) а затем выполнить итерацию? as list.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