成对查找字符串中的所有括号-Python 3

成对查找字符串中的所有括号-Python 3,python,tuples,Python,Tuples,我试图得到一个元组列表,其中包含字符串中所有括号集的索引。通过列表理解,我可以轻松独立地找到左右两侧: s = "12(34)567" left_parens = [i for i,j in enumerate(s) if j == "("] right_parens = left_parens = [i for i,j in enumerate(s) if j == ")"] 将这些单独的列表转换为具有(left-paren,right-paren)对的元组列表的最合乎逻辑的方法是使用zi

我试图得到一个元组列表,其中包含字符串中所有括号集的索引。通过列表理解,我可以轻松独立地找到左右两侧:

s = "12(34)567"

left_parens = [i for i,j in enumerate(s) if j == "("]
right_parens = left_parens = [i for i,j in enumerate(s) if j == ")"]
将这些单独的列表转换为具有(left-paren,right-paren)对的元组列表的最合乎逻辑的方法是使用zip函数

parens = zip(right_parens,left_parens)
print(list(parens))
我希望从中得出以下结论:

[(2,5)]
但是,我得到的是:

[(5,5)]
即使我像这样切换顺序:

parens = zip(left_parens,right_parens)
结果仍然是[(5,5)]

我错过了什么

问题在于:

right_parens = left_parens = [ ... ]
将两个列表设置为同一内存区域;它们现在是相同的列表。将它们分开:

left_parens  = [i for i,j in enumerate(s) if j == "("]
right_parens = [i for i,j in enumerate(s) if j == ")"]
延伸

请注意,您的算法不适用于嵌套括号:

s = "1(2(34)56)7"
输出:

[(1, 6), (3, 9)]
您可以使用一个计数器来解决这个问题:每个Lparen的预增量,每个Rparen的后减量。标记每个阵列位置及其嵌套级别:

string 1(2(34)56)7(8)
marker -1-2--2--1-1-1
从这里开始,从内到外移动:匹配2,从左到右(只有一对),然后匹配1(两对)。编码留给学生作为练习。:-)
从这里,您可以

right\u parens=left\u parens=…
Typo?您还需要正确处理嵌套的parens吗?如果是这样,列出理解就不够了。请注意,这些理解与你的父母不匹配。为此,有一个简单的增量/减量计数算法,可以干净地完成这项工作。如果你陷入困境,请将其作为一个单独的问题发布(但先搜索;我很确定至少有两个解决方案)。当你得到一个解决方案时,请记住投票选出有用的东西并接受你最喜欢的答案(即使你必须自己写),这样Stack Overflow就可以正确地存档该问题。哇,我想该结束了。抢手货我甚至不知道你能在一行中做到这一点,所以至少我学到了一些东西。