#python #list #split
#python #Список #разделить
Вопрос:
Я ищу компактный и элегантный способ без использования itertools.
Функция принимает строку, состоящую из круглых скобок (открытая скобка гарантированно будет иметь соответствующую закрывающую скобку) Затем он находит вложенную строку в самых внутренних скобках, переворачивает ее на место и удаляет соответствующие окружающие круглые скобки и возвращает измененную строку.
def swap_innermost(self, s): # example s = "(u(love)i)" returns "(uevoli)"
start= s.rfind('(')
end= start s[start:].find(')')
found= (start != -1) and (end != -1) # find()/rfind() returns -1 when not found
if found:
part1= s[0:start] if start != 0 else ''
part2= s[start 1:end][::-1] # chew out ( char and reverse rest
part3= s[end 1:] if end != len(s)-1 else '' # chew out ) char
return part1 part2 part3
else:
return s
Комментарии:
1. Если у вас есть строка типа
((ab)cd(ef))
, должна ли она поменять местами обаab
иef
? Аналогично, если у вас есть((ab)cd(ef(gh)ij))
, следует ли отменить обаab
иgh
?2. Код должен просто позаботиться о последнем ‘(‘ и связанном с ним ‘)’. Повторяющийся внешний цикл, когда swap_innermost() вызывает swap_innermost() несколько раз, пока все скобки не будут удалены, а содержимое поменяется местами, приведет к => ((ab)cd(ef)) станет ((ab)cdfe) … после второго вызова (bacdfe).. после 3-го вызова мы получаем efdcab.