lambda函数中匹配括号字符的索引?
Index of matching bracket character within a lambda function?
我很好奇而不是迫切需要。是否可以向 lambda 函数传递两个参数 s
和 i
。其中 s
是有问题的字符串, i
是第一个括号的索引;并让它 return 免费括号的索引?
我应该注意它只需要为括号 ()
工作,而不是 {}
或 []
.
例如
>>> f( '(() foo ) bar' , 0)
8
f
由 lambda 函数定义
编辑:我知道有很多方法可以找到匹配的括号。但是,我很好奇它是否可以简化为 lambda 表达式。
我懒得担心极端情况,但使用 itertools.accumulate
它相对简单:
f = lambda s,i: next((i for i,x in enumerate(accumulate
({'(': 1, ')': -1}.get(c,0) for c in s[i:]), i) if not x), None)
In [31]: s = '(() foo ) bar'
In [32]: f(s, 0)
Out[32]: 8
In [33]: f(s, 1)
Out[33]: 2
In [34]: f(s, 2)
这通过跟踪字符串的高度来工作,将(作为 +1 和)作为 -1 计算:
In [36]: list(accumulate({'(': 1, ')': -1}.get(c,0) for c in s))
Out[36]: [1, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
我很好奇而不是迫切需要。是否可以向 lambda 函数传递两个参数 s
和 i
。其中 s
是有问题的字符串, i
是第一个括号的索引;并让它 return 免费括号的索引?
我应该注意它只需要为括号 ()
工作,而不是 {}
或 []
.
例如
>>> f( '(() foo ) bar' , 0)
8
f
由 lambda 函数定义
编辑:我知道有很多方法可以找到匹配的括号。但是,我很好奇它是否可以简化为 lambda 表达式。
我懒得担心极端情况,但使用 itertools.accumulate
它相对简单:
f = lambda s,i: next((i for i,x in enumerate(accumulate
({'(': 1, ')': -1}.get(c,0) for c in s[i:]), i) if not x), None)
In [31]: s = '(() foo ) bar'
In [32]: f(s, 0)
Out[32]: 8
In [33]: f(s, 1)
Out[33]: 2
In [34]: f(s, 2)
这通过跟踪字符串的高度来工作,将(作为 +1 和)作为 -1 计算:
In [36]: list(accumulate({'(': 1, ')': -1}.get(c,0) for c in s))
Out[36]: [1, 2, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]