Задача символов химических элементов

#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. Большое вам спасибо, я ломал голову над этим весь день!