Оптимизируйте код Python, чтобы избежать ошибок во время выполнения

Для строки, которая может иметь несколько вхождений одного и того же символа, вернуть ближайший такой же символ из любого указанного символа в строке.

Учитывая строку s и количество запросов n. В каждом запросе вам дается индекс a (где 0 <= a <= |s|) символа, и вам нужно напечатать индекс того же символа в туалете. Если ответов несколько, выведите наименьший из них. В противном случае выведите -1.

Например, строка s = 'youyouy' с заданным запросом 3: есть два совпадающих символа с индексами 0 и 6, каждый из которых находится на расстоянии 3, мы выбираем наименьший из них, равный 0.

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

def closest(s, queries):
    res = []
    dict2 = {}

     #dict2 - letter - indexs
    for i in range(len(s)):
       if s[i] not in dict2:
           dict2[s[i]]=[i]
       else:
           dict2[s[i]].append(i)

    for num in queries:
         #closet- denotes closet letter index
        closet = math.inf
        #num is out of range , append -1
        if num > (len(s)-1):
            res.append(-1)
            continue
        #this is the only one letter, append -1 
        letter=s[num]
        if len(dict2[letter])==1:
            res.append(-1)
            continue
        #temp = list for that letters    
        temp=dict2[s[num]]
        index=temp.index(num) . #in the list, letter index's index in list

        if index==0:
            closet=temp[1]
        elif index==(len(temp)-1):
            closet=temp[index-1]
        else:
            distance1=num-temp[index-1] .   #left
            distance2=temp[index+1]-num .   #right
            if distance1 <= distance2:
                closet=temp[index-1]
            else:
                closet=temp[index+1]

        if closet == math.inf:
            res.append(-1)
        else:
            res.append(closet)
    return res  

У меня две ошибки во время выполнения. Мне интересно, не могли бы вы мне помочь, возможно, сократить время выполнения?

Кроме того, я ищу другие предложения! Некоторое время я использовал Python и ищу работу (новый выпускник университета). Java обычно работает быстрее Python? Стоит ли переходить на Java?

Какие у вас ошибки во время выполнения?

Håken Lid 03.11.2018 21:35

@ HåkenLid. они просто сказали мне, что они прерваны из-за ошибки времени выполнения, без чего-либо еще

Robin 03.11.2018 21:47

Вы можете значительно улучшить код, используя правильные имена переменных. temp или dict2 затрудняют чтение, и, как говорит Дзен Python, читаемость имеет значение. Также изучите приоритет операторов, в частности, == и > по сравнению с - (частый вопрос на собеседовании, поскольку он показывает более глубокое понимание) и избавьтесь от ненужных скобок в нескольких if.

digitalarbeiter 03.11.2018 22:01

Я изменил temp на t и dict2 на d и избавился от некоторых скобок в if s. Но все равно не работает. @digitalarbeiter

Robin 03.11.2018 22:09

@Robin Я не имел в виду, что вы еще больше сокращали имена переменных; скорее дайте им имена, которые на самом деле иметь в виду что-то. Не могли бы вы опубликовать s и queries, с которыми вы тестируете функцию?

digitalarbeiter 03.11.2018 22:18

Кто эти «они», которые выдали вам ошибку времени выполнения (или две, как бы это ни казалось маловероятным)? Если вы запустите это в терминале (/ console), какую ошибку вы получите? Редактировать укажите полный текст в вопросе, пожалуйста.

Jongware 03.11.2018 22:20

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

Robin 03.11.2018 22:24

@Robin Читаемые имена не сразу решают ошибку, которую вы ищете, но они буду помогают вам и другие понимать ваши мысли и код и, таким образом, облегчают другим помощь вам. Сделайте понятные идентификаторы привычка, которые вы никогда не сломаете, даже для самых непростых задач.

digitalarbeiter 03.11.2018 22:30

Вы пробовали писать модульные тесты для этой функции? Получите 100% покрытие py.test и постарайтесь придумать как можно больше и необычных вводов для ваших тестов: пустая строка, строки с умляутами (адское кодирование; вот ö только для вас), пустой список для запросов, отрицательное число для запроса и тому подобное. Неистовствовать! Я не знаю, что мы можем смело предположить для s и queries, поэтому отладить это сложно ..

digitalarbeiter 03.11.2018 22:37

Нет. Но я думаю, это из-за скорости. Python работает медленнее, чем Java. Я подумываю преобразовать свой код в java. Не могли бы вы помочь? @digitalarbeiter

Robin 03.11.2018 22:49

Мне любопытно: что приводит вас к выводу, что это может быть связано со скоростью? «Ошибка выполнения» указывает на то, что нет указывает время выполнения, это указывает на ошибку для входного значения, которое вы не придумали.

digitalarbeiter 03.11.2018 22:57

Python я делаю из любви. Чтобы сделать Java, вам нужно платить меня. J2EE, мы говорим о боевой оплате. :-П

digitalarbeiter 03.11.2018 22:59

Ну, ты даже не показал мне, что у тебя есть такая способность платить тебе за мою работу. @digitalarbeiter

Robin 03.11.2018 23:01
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
13
815
1

Ответы 1

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

s='oooyyouoy'
k='0123456789'
def cloest(string,pos):
    c = string[pos]
    p1 , p2 = s[:pos] , s[pos+1:]

    # reserve left part and find the closet one , add 1 because len(p1)=final_position + 1
    l = len(p1) - (p1[::-1].find(c) + 1) 
    # find without reserve and add 1 because s[pos+1:]
    r = (p2.find(c) + 1) + pos 

    # judge which one is closer if same chose left one
    result = l if (pos - l) <= (r - pos) else r 
    if result == pos:
        return -1
    else:
        return result

print(cloest(s,4))

Другие вопросы по теме