从列表中获取结束大括号索引的python代码

从列表中获取结束大括号索引的python代码,python,text-parsing,Python,Text Parsing,我有一个字符串的输入列表,我需要在其中传递任何开始大括号的索引,并期望python函数返回其相应的结束大括号的索引及其值 输入列表: mylist=[ 'a', 'b(', '(', 'cd', 'd(e)', 'hi)', 'last brace) ' ] 我需要得到列表的索引和字符串 getindex=func(mylist[2]) getindex应具有索引5的hi)。它应该忽略所有相应的平衡大括号,例如:d(e)或最后一个大括号)等 getindex=(5,'hi)') 我对pyt

我有一个字符串的输入列表,我需要在其中传递任何开始大括号的索引,并期望python函数返回其相应的结束大括号的索引及其值

输入列表:

mylist=[
'a',
'b(',
'(',
'cd',
'd(e)',
'hi)',
'last brace) '
]
我需要得到列表的索引和字符串

getindex=func(mylist[2])
getindex应具有索引5的
hi)
。它应该忽略所有相应的平衡大括号,例如:
d(e)
最后一个大括号)

getindex=(5,'hi)')

我对python不太熟悉,非常感谢您抽出时间来帮助我。谢谢

您只需要从起始线开始计算左大括号,当遇到左大括号时,增加它,当遇到右大括号时,减少它。当它再次达到零时,您将找到正确的索引

您的示例代码:

def get_closing_brace_index(str_list, left_idx):
    # input check, you can ignore it if you assure valid input
    if left_idx < 0 or left_idx >= len(str_list) or '(' not in str_list[left_idx]:
        return -1, ''

    # use a left brace counter
    left_count = 0
    # just ignore everything before open_brace_index
    for i, s in enumerate(str_list[left_idx:]):
        for c in s:
            if c == '(':
                left_count += 1
            elif c == ')':
                left_count -= 1
                # find matched closing brace
                if left_count == 0:
                    return i + left_idx, str_list[i + left_idx]
                # invalid brace match
                elif left_count < 0:
                    return -1, ''
    return -1, ''

def test():
    mylist = [
        'a',
        'b(',
        '(',
        'cd',
        'd(e)',
        'hi)',
        'last brace) '
    ]

    print(get_closing_brace_index(mylist, 1))
    # output (6, 'last brace) ')
    print(get_closing_brace_index(mylist, 2))
    # output (5, 'hi)')
    print(get_closing_brace_index(mylist, 4))
    # output (4, 'd(e)')
    print(get_closing_brace_index(mylist, 0))
    # output (-1, '')
    print(get_closing_brace_index(mylist, 6))
    # output (-1, '')
def get_closing_brake_index(str_list,left_idx):
#输入检查,如果确保输入有效,则可以忽略它
如果left_idx<0或left_idx>=len(str_列表)或“(”不在str_列表[left_idx]中):
返回-1,'
#使用左括号计数器
左计数=0
#在打开索引之前忽略所有内容
对于枚举中的i,s(str_list[left_idx:]):
对于s中的c:
如果c=='(':
左计数+=1
elif c==')':
左计数-=1
#找到匹配的右括号
如果左_计数=0:
返回i+left\u idx,str\u list[i+left\u idx]
#大括号匹配无效
elif left_计数<0:
返回-1,'
返回-1,'
def test():
mylist=[
“a”,
"b(",,
'(',
“cd”,
"d(e)",,
"嗨",,
“最后一个括号)”
]
打印(获取索引(mylist,1))
#输出(6,‘最后一个大括号)’)
打印(获取索引(mylist,2))
#输出(5,‘hi’)
打印(获取索引(mylist,4))
#输出(4,‘d(e)’)
打印(获取索引(mylist,0))
#输出(-1,,)
打印(获取索引(mylist,6))
#输出(-1,,)

希望对您有所帮助。

您只需从起始线开始计算左大括号,遇到左大括号时,增加它,遇到右大括号时,减少它。当它再次达到零时,您将找到正确的索引

您的示例代码:

def get_closing_brace_index(str_list, left_idx):
    # input check, you can ignore it if you assure valid input
    if left_idx < 0 or left_idx >= len(str_list) or '(' not in str_list[left_idx]:
        return -1, ''

    # use a left brace counter
    left_count = 0
    # just ignore everything before open_brace_index
    for i, s in enumerate(str_list[left_idx:]):
        for c in s:
            if c == '(':
                left_count += 1
            elif c == ')':
                left_count -= 1
                # find matched closing brace
                if left_count == 0:
                    return i + left_idx, str_list[i + left_idx]
                # invalid brace match
                elif left_count < 0:
                    return -1, ''
    return -1, ''

def test():
    mylist = [
        'a',
        'b(',
        '(',
        'cd',
        'd(e)',
        'hi)',
        'last brace) '
    ]

    print(get_closing_brace_index(mylist, 1))
    # output (6, 'last brace) ')
    print(get_closing_brace_index(mylist, 2))
    # output (5, 'hi)')
    print(get_closing_brace_index(mylist, 4))
    # output (4, 'd(e)')
    print(get_closing_brace_index(mylist, 0))
    # output (-1, '')
    print(get_closing_brace_index(mylist, 6))
    # output (-1, '')
def get_closing_brake_index(str_list,left_idx):
#输入检查,如果确保输入有效,则可以忽略它
如果left_idx<0或left_idx>=len(str_列表)或“(”不在str_列表[left_idx]中):
返回-1,'
#使用左括号计数器
左计数=0
#在打开索引之前忽略所有内容
对于枚举中的i,s(str_list[left_idx:]):
对于s中的c:
如果c=='(':
左计数+=1
elif c==')':
左计数-=1
#找到匹配的右括号
如果左_计数=0:
返回i+left\u idx,str\u list[i+left\u idx]
#大括号匹配无效
elif left_计数<0:
返回-1,'
返回-1,'
def test():
mylist=[
“a”,
"b(",,
'(',
“cd”,
"d(e)",,
"嗨",,
“最后一个括号)”
]
打印(获取索引(mylist,1))
#输出(6,‘最后一个大括号)’)
打印(获取索引(mylist,2))
#输出(5,‘hi’)
打印(获取索引(mylist,4))
#输出(4,‘d(e)’)
打印(获取索引(mylist,0))
#输出(-1,,)
打印(获取索引(mylist,6))
#输出(-1,,)

希望能对您有所帮助。

请将您的代码放在这里,让我们看到您的需求。您需要重新思考您的功能设计
mylist[2]
只是字符串
”(“
,函数如何知道起始点的索引?列表中很容易有多个
”(“
元素。就此而言,它如何知道要搜索的列表?更好的“签名”是
func(mylist,2)
。我同意。谢谢你的回答。在我的文本文件中,我已经知道大括号的开头是一个字符“(”,我选择了第一个出现的“(”,没有其他字符。我可以传递func(mylist[2])或func(mylist,2)请将您的代码放在这里,让我们看到您的需求。您需要从重新考虑函数的设计开始。
mylist[2]
只是字符串
”(“
),您的函数如何知道起始点的索引?可以很容易地有多个
”(“
列表中的元素。就此而言,它如何知道要在哪个列表中搜索?一个更好的“签名”是
func(mylist,2)
。我同意。感谢您的回复。在我的文本文件中,我已经知道大括号中的单个字符是“(”并且我正在选择第一个出现的“”('没有其他字符。我可以通过func(mylist[2])或func(mylist,2)太棒了!非常感谢recnac@.这是可行的,我将尝试使用此代码并在返回-1时引发异常。当一个测试用例有两个
((
在其中,你需要找到索引,在这种情况下,维克似乎提到了“我正在收集第一次发生的”(“”@prashantranait最好使用队列来实现它,从0开始查找所有打开和关闭对索引,然后提供答案对于更复杂的问题,
stack
是更好的解决方案,但它很简单,只需一个计数器就可以处理它,而且速度更快:)@prashantranaAwesome!。非常感谢recnac@.这是可行的,我将尝试使用此代码并在返回-1的情况下引发异常。当一个测试用例中有两个
)时,这将失败,并且您需要在这种情况下找到索引Vick似乎提到“我正在拾取第一个发生的”(“”@prashantranait最好使用队列实现它,从0开始查找所有打开和关闭对索引,然后为更复杂的问题提供答案,
stac