Индекс строки вне диапазона, несмотря на итерации в диапазоне - PullRequest
0 голосов
/ 07 января 2020

Я пытаюсь создать надежную проверку пароля, используя Python. Условия пароля следующие:

  • Он содержит не менее 6 символов и не более 20 символов.
  • Он должен содержать хотя бы одну строчную букву, хотя бы одну заглавную букву и хотя бы одну цифру git.
  • Он НЕ должен содержать трех повторяющихся символов подряд («... ааа ...» слабый, но «... аа ... а ...» сильный, предполагая, что другие условия met).

Напишите функцию strongPasswordChecker (s), которая принимает в качестве входных данных строку s и возвращает минимальное изменение, необходимое для создания надежного пароля. Если s уже является сильным, вернуть 0.

Вставка, удаление или замена любого одного символа рассматриваются как одно изменение.

Моя попытка заключается в следующем:

import re

class Solution:
    def strongPasswordChecker(self, s: str) -> int:

        # Holds the change
        change = 0

        # Checks if the password length is less than 6
        if len(s) < 6:
            change += 6 - len(s)

        # Checks if the password length is greater than 20
        elif len(s) > 20:
            change += len(s) - 20

        # Checks if the password has at least one digit
        elif re.search(r'\d', s):
            change += 1

        # Checks if the password has at least one upper case letter
        elif re.search(r'[A-Z]', s):
            change += 1

        # Checks if the password has at least one lower case letter
        elif re.search(r'[a-z]', password):
            change += 1

        # Checks for repeating characters
        for i in range(1, len(s)):
            if i >= 3 and i < len(s):
                if s[i] == s[i + 1] and s[i + 1] == s[i + 2]:
                    change += 1

        return change

Несмотря на проверку повторяющихся символов с помощью оператора if, я все еще получаю следующую ошибку:

IndexError: String Index out of range

1 Ответ

4 голосов
/ 07 января 2020

Проблема в том, что этот оператор может go выходить за пределы, например, когда i == len(s) - 1, тогда s[i + 1] и s[i + 2] будут индексироваться за пределами.

for i in range(1, len(s)):
    if i >= 3 and i < len(s):
        if s[i] == s[i + 1] and s[i + 1] == s[i + 2]:
            change += 1

Если вы хотите чтобы убедиться, что у вас нет групп из 3 или более, я бы использовал itertools.groupby

>>> any(len(list(g)) > 2 for k, g in groupby('aabbcc'))
False
>>> any(len(list(g)) > 2 for k, g in groupby('aabbbbbcc'))
True

Чтобы заменить for l oop в вашем коде, вы должны использовать это как

elif any(len(list(g)) > 2 for k, g in groupby(s)):
    change += 1
...