2015-09-12 2 views
2

У меня проблемы с Python.Python проверить, существует ли следующий элемент в списке

У меня есть следующий код:

def SimpleSymbols(str): 
    letters = [] 
    results = [] 

    for i in range(len(str)): 
     if str[i] != '=' and str[i] != '+': 
      letters.append(str[i]) 

      if str[i-1] == '+' and str[i+1] == '+': 
       results.append(str[i]) 

    return len(letters) == len(results) 

https://repl.it/BH1s/1

Если я проверить print(SimpleSymbols('++d+===+c++==')) все идет хорошо, но если я проверить print(SimpleSymbols('++d+===+c++==+a'))

Я получаю эту ошибку:

Traceback (most recent call last): File "python", line 15, in File "python", line 9, in SimpleSymbols IndexError: string index out of range

Может кто-нибудь объяснить n меня, пожалуйста, почему?

+1

Обычно в функции Python являются 'lower_case', то есть' simple_symbols', и вы не переопределять встроенные команды, как 'str', который строит объект строки. Может быть, 'def simple_symbols (символы):'. См. [Соглашения об именах PEP8] (https://www.python.org/dev/peps/pep-0008/#naming-conventions) –

+0

Ваш код возвращает 'True' для' SimpleSymbols («C++») '. Это предназначено? –

ответ

1

потому что, когда вы добираетесь до последнего символа str, и это письмо, то str[i+1] не существует.

Вам необходимо разместить это условие в блоке try except, чтобы этого не произошло. (Вы должны решить, что делать в except когда IndexError поднята)

def SimpleSymbols(str): 
    letters = [] 
    results = [] 

    for i in range(len(str)): 
     if str[i] != '=' and str[i] != '+': 
      letters.append(str[i]) 
     try: 
      if str[i-1] == '+' and str[i+1] == '+': 
       results.append(str[i]) 
     except IndexError: 
      do what needs to be done in this case. 

    return len(letters) == len(results) 
+0

Я не думаю, что это исключительное условие. Это можно объяснить логикой. Я знаю [EAFP] (https://docs.python.org/2/glossary.html#term-eafp), но если бы были другие 'IndexError', было бы сложно определить, что делать. –

+0

Согласен, это выбор, чтобы понять, как с этим справиться. Здесь попытка, за исключением того, имеет преимущество в том, чтобы быть проще, чем изменять логику. –

+0

@PeterWood является исключительным, поскольку более 95% времени вам не нужно беспокоиться и не сможет «str [i + 1]» просто отлично –

2

Вы пытаетесь получить доступ к индексу str[i+1], который, на последней итерации, вне границ ...

В случае, если вы должны использовать его, ограничить цикл, чтобы работать только до len(str)-1. Для обработки дела: '++d+===+c++==+a' вы можете добавить проверку после цикла, чтобы убедиться, что элемент один-на-последнем не + (или добавить его в состояние if в цикле).

Кроме того, это плохая практика, чтобы назвать вашу переменную str, которая является встроенной функцией python!

+0

Я понимаю, но как пропустить эту ошибку? – Hiero

+0

Если я делаю len-1, то SimpleSymbols ('++ d + === + C++ == + a') истинно, что является ложным в моем случае, потому что aint имеет следующий элемент a + – Hiero

+1

В этом случае измените: 'if str [i-1] == '+' и str [i + 1] == '+':' to: 'if str [i-1] == '+' и i alfasin

1
def SimpleSymbols(str): 
    letters = [] 
    results = [] 

    for i in range(len(str)): 
     if str[i] != '=' and str[i] != '+': 
      letters.append(str[i]) 

      if i < len(str)-1 and str[i-1] == '+' and str[i+1] == '+': 
       results.append(str[i]) 

    return len(letters) == len(results) 

print SimpleSymbols("=+b+a") 

писать код таким образом, все будет в порядке.

1

Вы, кажется, ищете символы, которые не являются ни +, ни =, и убедитесь, что все такие символы сопровождаются и предшествуют +.

Первый и последний символ являются особыми случаями в том, что их либо не предшествуют ни следуют ничего, и, таким образом, если они не являются ни +, ни = ваша функция должна возвращать False.

Поскольку в питоне, some_string[-1] возвращает последний символ строки, ваш цикл не ломается, если первый символ не является ни +, ни =. Даже возврат True для ввода, например c++. Однако для последнего персонажа ваш код вызывает IndexError, который ожидается.

Вы можете:

  • проверить, если первый или последний символ в ('+', '=') и вернуть False если они делают, так как они не могут предшествовать или следовать за +.После этого вы можете запустить цикл на внутренней строке:

    def SimpleSymbols(symbols): 
        control = ('+', '=') 
    
        if symbols[0] not in control or symbols[-1] not in control: 
         return False 
    
        for last_index, symbol in enumerate(symbols[1:-1]): 
         next_index = last_index + 2 
         if letter not in control: 
          if symbols[last_index] != '+' or symbols[next_index] != '+': 
           # Found a letter that is not enclosed in two '+' 
           return False 
        return True 
    
  • использовать регулярные выражения для подсчета вхождений как символы, которые не являются в ('+', '=') и те, в той же группе, что заключены в двух +:

    import re 
    
    def SimpleSymbols(symbols): 
        simples = len(re.findall(r'[^+=]', symbols)) 
        enclosed = len(re.findall(r'\+[^+=]\+', symbols)) 
    
        return simples == enclosed 
    
Смежные вопросы