#python #string
#питон #строка
Вопрос:
Я должен выполнить задачу, в которой нам нужно проверить, является ли символ допустимым символом (по правилам задачи)
Справочная информация о задаче, которую я, вероятно, не смогу объяснить:
Пример, приведенный в задании:
def isvalid(symbol, element, length = None): elbool = False if symbol[0]!=symbol[0].upper(): return False #first letter in the symbol has to be a capital letter for i in range(len(symbol)-1): if element.find(symbol[i 1])gt;element.find(symbol[i]): #checking if the order is correct elbool = True else: return False if length is not None: if len(symbol)!=length: return False else: elbool = True return elbool
Это мой код сейчас, но он не работает, например, с этим: isvalid («Rcm», «Америций»), потому что перед c стоит буква «м», и это считается.
Поэтому я думаю, что мне нужно разделить строку элемента от последней буквы в символе, чтобы у меня не было этой проблемы, но как мне это сделать?
Извините, если вопрос немного сбивает с толку.
Комментарии:
1. всегда указывайте код, данные и полное сообщение об ошибке в виде текста (не скриншот, не ссылка) в вопросе (не в комментарии). Это будет более читабельно, и больше людей увидят это — так что больше людей смогут вам помочь.
2. возможно, вам следует использовать
find(..., start_position)
для поиска по предыдущему символу.3. Разрешено ли вам использовать модуль регулярных выражений? это один из случаев, когда это было бы намного проще.
Ответ №1:
Вам нужно использовать .find(needle, start_pos)
для поиска персонажа после определенного места в element
. Кроме того, вам не нужно возиться с индексами и продолжать находить предыдущий и текущий символ symbol
. Просто следите за местоположением текущего персонажа для следующей итерации.
Вы также должны выполнить поиск без учета регистра, потому что, используя ваш пример, нет "R"
in "Americium"
. Я делаю это, преобразуя element
один раз в нижний регистр, а затем делая .find(c.lower(), ...)
для каждого символа в symbol
Наконец, вы забыли проверить, что все символы, кроме первого, написаны в symbol
нижнем регистре. Я также добавил это в цикл for.
element = element.lower() # Lowercase element so that we can find characters correctly lastfound = 0 for ix, c in enumerate(symbol): if ix gt; 0 and c.isupper(): # Not the first character, and is uppercase return False thisfound = element.find(c.lower(), lastfound) # Find the location of this character if thisfound == -1: # character not found in element after location lastfound return False lastfound = thisfound # Set lastfound for the next iteration
Несколько других незначительных предложений:
- Вы сможете
return False
, как только обнаружите что-то не так. Затем, в конце функции, простоreturn True
потому, что единственный способ достичь конца-это когда все в порядке. - Вы можете проверить, является ли символ строчным с
symbol[0].islower()
помощью . Не нужно этого делатьsymbol[0] != symbol[0].upper()
. - Вы должны проверить требование к длине, прежде чем проверять порядок символов, потому что это более простая проверка.
Применяя все эти:
def isvalid(symbol, element, length = None): if symbol[0].islower(): return False if length is not None and len(symbol) != length: return False element = element.lower() # Lowercase element so that we can find characters correctly lastfound = 0 for ix, c in enumerate(symbol): if ix gt; 0 and c.isupper(): return False thisfound = element.find(c.lower(), lastfound) # Find the location of this character if thisfound == -1: # character not found in element after location lastfound return False lastfound = thisfound # Set lastfound for the next iteration return True
Использование ваших тестов:
gt;gt; isvalid('Zer', 'Zeddemorium') True gt;gt; isvalid('Zer', 'Zeddemorium', 2) False gt;gt; isvalid('di', 'Zeddemorium') False gt;gt; isvalid('Rcm', 'Americium') True
Комментарии:
1. Большое вам спасибо, я ломал голову над этим весь день!