#python #file #dictionary #overlapping
#питон #файл #словарь #перекрытие
Вопрос:
Я начну с того, что скажу, что я совершенно новичок в Python, и этот класс-первый класс Python, который я когда-либо посещал. Я пытаюсь выполнить задание и после нескольких дней проб и ошибок все еще не могу понять, как правильно ответить на этот вопрос. Мне дали текстовый файл под названием QA_Pairs.txt, и в нем есть пары вопросов и ответов (таким образом, строка 1-это вопрос, строка 2-ответ на этот вопрос и так далее в течение примерно 5000 строк). Это часть файла, для контекста:
«вопрос, кто избежал преследования Дома Старков?
ответь Безликий Человек
вопрос: Чему обучают Арью в Доме Черно-белых в Браавосе?
ответьте Дому Старка
вопрос: Кто был безликим человеком в Браавосе?
ответь Фрею»
Некоторые ответы были использованы для ответа более чем на один вопрос(например, ответ «Тирион» был сопряжен с несколькими вопросами). Поэтому, если один и тот же ответ или вопрос используется в файле более одного раза, он должен быть записан в Overlapping.txt файл, в противном случае он должен быть записан в unique_QA_pairs.txt.
Для более подробного контекста, вот точный способ, которым этот вопрос написан в моем задании:
- Сколько пар контроля качества в QA_Pairs.txt? Здесь (q1, a1) — пара, где q означает вопрос, а a-ответ.
- Уникальны ли эти пары? Например: (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. Выполнено. Спасибо за предложение