2017-08-20 9 views
0

私はもっと必要な時よりももっと好奇心が強いです。ラムダ関数に2つの引数siを渡すことは可能でしょうか?ここで、sは問題の文字列で、iは最初の括弧のインデックスです。それは無料のブラケットのインデックスを返している?ラムダ関数内で一致するブラケット文字のインデックス?

()の角かっこのみで、{}または[]ではないことに注意してください。

>>> f('(() foo) bar' , 0) 
8 

f例えば

はラムダ関数によって

編集定義される:私は多くの方法がマッチングブラケットを見つけるために存在することを承知しています。しかし、ラムダ式に単純化できるのであれば私は興味があります。

+2

できます。しかしそれはかわいくないでしょう。 –

+0

@ juanpa.arrivillagaいいえ、私はそれがないと思います – Graviton

答えて

4

私は、コーナーケースを心配してはあまりにも怠惰なんだけど、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] 
関連する問題