Как записать перекрывающиеся пары вопросов и ответов в Новые файлы?

#python #file #dictionary #overlapping

#питон #файл #словарь #перекрытие

Вопрос:

Я начну с того, что скажу, что я совершенно новичок в Python, и этот класс-первый класс Python, который я когда-либо посещал. Я пытаюсь выполнить задание и после нескольких дней проб и ошибок все еще не могу понять, как правильно ответить на этот вопрос. Мне дали текстовый файл под названием QA_Pairs.txt, и в нем есть пары вопросов и ответов (таким образом, строка 1-это вопрос, строка 2-ответ на этот вопрос и так далее в течение примерно 5000 строк). Это часть файла, для контекста:

«вопрос, кто избежал преследования Дома Старков?

ответь Безликий Человек

вопрос: Чему обучают Арью в Доме Черно-белых в Браавосе?

ответьте Дому Старка

вопрос: Кто был безликим человеком в Браавосе?

ответь Фрею»

Некоторые ответы были использованы для ответа более чем на один вопрос(например, ответ «Тирион» был сопряжен с несколькими вопросами). Поэтому, если один и тот же ответ или вопрос используется в файле более одного раза, он должен быть записан в Overlapping.txt файл, в противном случае он должен быть записан в unique_QA_pairs.txt.

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

  1. Сколько пар контроля качества в QA_Pairs.txt? Здесь (q1, a1) — пара, где q означает вопрос, а a-ответ.
  2. Уникальны ли эти пары? Например: (q1, a1) (q1, a1) идентичны и перекрываются; (q1, a1) (q1, a2) перекрываются, и (q1, a1) (q2, a1) также перекрываются. Если они не уникальны, найдите перекрывающиеся пары и сгенерируйте unique_QA_Pairs.txt файл и Overlapping.txt файл. Формат проведения unique_QA_Pairs.txt и Overlapping.txt являются такими же, как QA_Pairs.txt.

Поэтому моя задача состоит в том, чтобы создать функцию,которая берет перекрывающиеся пары ((q1, a1) и (q1, a2), например)) и записывает их в новый файл под названием Overlapping.txt. Все уникальные пары должны быть записаны в новый файл под названием unique_QA_pairs.txt. Оба файла должны иметь тот же формат, что и QA_Pairs.txt.

Я перепробовал кучу разных подходов, но, похоже, ничего не работает. Это лучшее, что у меня есть до сих пор: Overlapping_pairs()

 file_object = "QA_Pairs.txt"  overlappedQ = [] overlappedA = []  uniqueQ = []  uniqueA =[]   with open(file_object, 'r') as file:   i = 1  for line in file:   if line.startswith("question"):   if (line[len("question"):] in uniqueQ):  overlappedQ.append(line[len("question"):].rstrip("n"))  overlappedA.append(line[len("answer"):].rstrip("n"))    else:   uniqueQ.append(line[len("question"):].rstrip("n"))  if line.startswith("answer"):  if (line[len("answer"):] in uniqueA):   overlappedQ.append(line[len("question"):].rstrip("n"))  overlappedA.append(line[len("answer"):].rstrip("n"))  else:   uniqueA.append(line[len("answer"):].rstrip("/n"))   if (len(overlappedA) == 0 and len(overlappedQ) == 0):   with open ("unique_QA_pairs.txt", "w") as f:  f.write(uniqueQ[i])  f.write(uniqueA[i])  file.write("n") else:   with open("Overlapping.txt", "w") as file:   for i in range(len(overlappedA)):   file.write(overlappedQ[i])  file.write(overlappedA[i])  file.write("n")    

если имя == «основное«:

 Overlapping_pairs()  

Я знаю, что это не очень хорошо, поэтому, если есть более краткие способы сделать это, не стесняйтесь, дайте мне знать. Любая помощь будет признательна!

Комментарии:

1. Что вы подразумеваете под «перекрывающимися парами»?

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

3. «Итак, моя задача состоит в том,чтобы создать функцию, которая берет перекрывающиеся пары ((q1, a1) и (q1, a2), например)) и записывает их в новый файл под названием Overlapping.txt.» Похоже, вам сначала нужно определить, какие пары «перекрываются».

4. Да, вот в чем у меня проблема. Файл содержит более 5000 пар вопросов и ответов. Поэтому я пытаюсь понять, как написать программу, которая определяет, где существуют пары.

5. Допустим, у вас было 10 пар вопросов и ответов на листе бумаги. Как бы вы нашли «перекрывающиеся пары»? Опишите словами шаги, которые вы бы предприняли, чтобы сделать это самостоятельно.

Ответ №1:

Одна из узких проблем заключается в следующем блоке кода: дескриптор открытого файла f , но ваша последняя операция записи пытается использовать file :

 with open ("unique_QA_pairs.txt", "w") as f:  f.write(uniqueQ[i])  f.write(uniqueA[i])  file.write("n") # Raises an error.  

Я не понимаю вашего описания разницы между двумя выходными файлами ( Overlapping.txt vs unique_QA_pairs.txt ), в частности, какие критерии должны использоваться для определения уникальности. Просто текст вопроса, текст вопроса и ответа или что-то еще?

Поэтому я сосредоточусь на нескольких предложениях по более простому способу чтения входных данных. Ваш текущий код повторяющийся, с похожими вызовами rstrip() и len() скрытыми в различных ветвях if-else. Ничего из этого не нужно. Аналогичным образом, ваш код усложняется тем фактом, что вы храните вопросы и ответы в отдельных списках. Но данные по своей сути взаимосвязаны: каждый вопрос сопряжен с ответом. Таким образом, в большинстве условий хранение данных единым способом будет иметь больше смысла. В этом наброске я буду использовать список (question, answer) кортежей. Наконец, зачем утруждать себя удалением ведущего question и answer префиксы в каждой строке, если выходные файлы должны иметь один и тот же формат? Просто оставьте текст в покое по большей части.

 def overlapping_pairs():  # Read the Q-A pairs.  with open('QA_Pairs.txt') as fh:  pairs = []  while True:  q = next(fh, '').rstrip()  a = next(fh, '').rstrip()  if q:  pairs.append((q, a))  else:  break   # Usage illustration.  for q, a in pairs:  print(q)  print(a)  if __name__ == '__main__':  overlapping_pairs()  

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

Комментарии:

1. Выполнено. Спасибо за предложение