Я пишу код на 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 как и ожидалось.
Что здесь происходит?
И он сравнивал '([()])' ( с [ вместо ( с ), понял.






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