Программа, которая выбирает случайное нечетное число и добавляет его содержимое в список не работает - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь создать код, который выберет случайное число, а затем использует это число, чтобы поместить содержимое определенных строк в текстовом файле в список.

Я не хочу, чтобы вопрос добавлялся в список более одного раза, поэтому я создал другой список, который будет содержать все выбранные числа.Все вопросы в нечетных строках, а ответы - в четных строках, поэтому сгенерированное число также должно быть четным.

Ниже приведен код, который я пытался сделать, но он не работает.

import random

#the empty question list
qlist=[0,0,0,0,0]
#the list that is filled with question numbers that have already been chosen
noschosen=[]
file=open('questiontest.txt')
lines=file.readlines()
i=0
#random question chooser
while i<len(qlist):
    chosen=False
    n=random.randint(1,10)
    for index in range(0,len(noschosen)):
        if n==noschosen[index]:
            chosen=True
    #all questions are on odd lines, so the random number can't be even.
    while n%2==0 or chosen==True:
        n=random.randint(1,10)
    #the number chosen is added to the chosen list
    noschosen.append(n)
    #the program adds the question and its answer to qlist
    qlist[i]=(lines[n],lines[n+1])
    #increment
    i=i+1

print (qlist)

Это то, что находится в следующем файле:

.
Question1
Answer1
Question2
Answer2
Question3
Answer3
Question4
Answer4
Question5
Answer5
Question6
Answer6
Question7
Answer7
Question8
Answer8
Question9
Answer9
Question10
Answer10

Точка в первой строке является преднамеренной.

Я ожидаю, что программа заполнит список случайным образом вэто мода:

[('QuestionA', 'AnswerA'), 
 ('QuestionB', 'AnswerB'),
 ('QuestionC', 'AnswerC'),
 ('QuestionD', 'AnswerD'),
 ('QuestionE', 'AnswerE')]

Буквы AB C, D и E обозначают любое из чисел от 1 до 10. Например, если первым n оказалось 5, «Вопрос3» и «Ответ3»будет поставлен на первое место (поскольку в строке 5 находится вопрос 3).

Номер вопроса и соответствующий ответ должны быть сгруппированы вместе.Я не уверен, почему мой текущий код не работает, кто-нибудь может увидеть проблему или как я мог бы улучшить этот код в целом?

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Прежде всего, у вас есть номера строк, которые идут до 20, но вы выбираете только из первых 10. Еще лучше, даже не пытайтесь разрешить четное число: возьмите случайное число 1-10, ивыведите номер строки из этого:

q_line = 2*n - 1

Вопрос находится на lines[q_line] с ответом на следующую строку.


Перед тем, как приступить к 20 строкам кода одновременно,Вы должны изучить меньшие методы, чтобы сделать вашу жизнь проще.Большая часть вашего кода может быть заменена на random.sample, метод, который может просто вернуть 5 случайных элементов из списка.Если вы объедините свои вопросы и ответы в список пар (кортежей), то вы можете просто сказать sample, что вы хотите получить пять пар из этого списка.Смотри здесь .

0 голосов
/ 30 января 2019

Вы проверяете, выбран ли номер только для первого полученного вами случайного числа, после этого вы генерируете случайные числа для этого значения, пока

while n%2==0 or chosen==True:
    n=random.randint(1,10)

, но никогда не проверяете, выбрано ли уже новое число.

Также вы можете проверить, выбрано ли число с помощью if n in noschosen или сделать chosen = n in noschosen и избежать цикла for

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...