Неожиданный вывод строковой функции в Python 3

Я пишу код на Python 3 — или пытаюсь — который принимает строку фигурных скобок, такую ​​как '{{]]', и ищет соседнюю пару фигурных скобок, которая представляет собой либо '[', за которой сразу следует ']', либо '{', за которым сразу следует '}', или '(', за которым сразу следует ')'. Он возвращает первую найденную пару или False, если не находит ни одной. Для этого я написал код:

# write a function that scans a sequence of braces to find a "married pair", or else returns false if there is none.  
def find(mystring):
    for x in mystring[0:-1]:
        y=mystring[mystring.index(x)+1:][0]
        if (x == '[' and y == ']') or (x == '{' and y == '}') or (x == '(' and y == ')'):
            return x,y
        else:
            continue
    return False


Итак, все работает, когда я пытаюсь найти функцию поиска в строке ({}). Он возвращает ('{','}'), как и ожидалось. Но когда я пытаюсь найти ('{{}}'), он неожиданно возвращается False. Бег ([()]) неожиданно возвращается False. ([{}]) возвращает True как и ожидалось.

Что здесь происходит?

mystring.index(x) не возвращает индекс, на который вы смотрите. Он возвращает индекс первый данного символа. Поэтому, когда вы находитесь на втором символе {, index(x) возвращает 0. Если вы используете индексы во время итерации, используйте enumerate.
khelwood 10.07.2019 16:37

И он сравнивал '([()])' ( с [ вместо ( с ), понял.

John Smith 10.07.2019 18:12
Почему в 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
2
61
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

.index() возвращает ПЕРВЫЙ индекс появления этого символа, поэтому, когда у вас больше 1, вы получаете неправильный y.

вы можете соединить соседние символы, используя zip следующим образом:

def find(mystring):
    pairs = zip(mystring, mystring[1:])
    for x, y in pairs:
        if (x == '[' and y == ']') or (x == '{' and y == '}') or (x == '(' and y == ')'):
            return x, y
        else:
            continue
    return False


print(find('({})'))
print(find('{{}}'))
print(find('([()])'))
Ответ принят как подходящий

mystring.index(x) не возвращает индекс, на который вы смотрите. Он возвращает индекс первый данного символа. Поэтому, когда вы находитесь на втором символе { в {{}}, index(x) возвращает 0. Если вы используете индексы во время итерации, используйте enumerate.

Исправленная версия может быть такой:

def find(mystring):
    for i,x in enumerate(mystring[:-1]):
        y = mystring[i+1]
        if (x == '[' and y == ']') or (x == '{' and y == '}') or (x == '(' and y == ')'):
            return x,y
    return False

Попробуй это:

def find_married_braces(s):
    for i in range(len(s)-1):
        a, b = s[i], s[i+1]
        if (a == '(' and b == ')') or (a == '[' and b == ']') or (a == '{' and b == '}'):
            return i, i+1
    return False


print(find_married_braces('{{]]'))
print(find_married_braces('{{}}'))
print(find_married_braces('([()])'))
print(find_married_braces('([{}])'))

Выход

False
(1, 2)
(2, 3)
(2, 3)

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