#python
#python
Вопрос:
Я начинающий программист, готовящийся к олимпиаде по информатике, пытаясь решить некоторые из задач для начинающих, которые есть на их веб-сайте. Мой любимый код — python. Один вопрос, на котором я застрял, касается чтения входного файла, где в первой строке есть два целых числа, разделенных пробелом, представляющих количество записей в словаре (каждая запись имеет номер и его перевод (другое число) рядом с ним) и количество строк (после словарных записей) целых чисел. Я должен написать решение, которое преобразует эти целые числа. Для целых чисел без перевода используется ‘C?’.
Пример ввода
5 6
2 71
3 556
140 19
87 555
71 3
140
2
87
2
3
4
Выходной пример
19
71
555
71
556
C?
Моим первоначальным решением было искать каждое целое число, которое мне нужно было перевести, в словаре, а затем добавлять его перевод в выходной файл.
input_file = open("dictin.txt", "r")
output_file = open("dictout.txt", "a")
input_file_list = input_file.readlines()
info = input_file_list[0].split()
dictionary = input_file_list[1:int(info[0]) 1]
phrase = input_file_list[int(info[0]) 1: len(input_file_list)]
for word in phrase:
key_num = 0
word_exists = False
for key in dictionary:
if int(key.split()[0]) == int(word):
output_file.write(key.split()[1] "n")
word_exists = True
break
else:
key_num = 1
if not word_exists:
output_file.write("C?n")
word_exists = False
input_file.close()
output_file.close()
Хотя это решение действительно работает, оно не соответствует ограничению по времени в 1 секунду, требуемому для решения проблемы, что означает, что оно слишком неэффективно. Однако я не уверен, как заставить его работать быстрее. Я пытался найти лучший способ определить, существует ли слово в словаре, в первую очередь, но это не работает из-за того, как я анализирую файл. Возможно ли какой-нибудь синтаксис или, возможно, модуль, который я мог бы импортировать (при необходимости). Помощь очень ценится.
Комментарии:
1. Проблема кодирования — отвлекающий маневр, ИМХО. В любом случае, оптимизация требует измерения улучшений, поэтому настройте эталон. Кроме того, если вы не знаете, где вы проводите сколько времени, вы можете только догадываться, какой код улучшить. Наконец, ненужное повторение — это убийца времени.
Ответ №1:
Прежде всего, вы постоянно взаимодействуете со своими входными данными в виде строк, преобразуя их в int
каждый раз, когда обращаетесь к ним. Это огромная трата времени. Вместо этого, как предполагает проблема, создайте словарь (Python dict
) из входных данных. Если это для вас ново, тогда поработайте с руководством по dicts — Stack Overflow — это не то место, где нужно повторять существующие руководства.
Вы теряете время, перебирая dict, просто чтобы найти ключ. Вы можете прервать этот цикл. Преобразовать word
в int
, затем
if word in dict:
Еще лучше, вы должны использовать get
для поиска с резервным значением:
out_val = my_dict.get(word, 'C')
Затем вы записываете out_val
в выходной файл.