0

一度に 3 つの要素にまたがる操作をリストに適用したいと考えています。

要素は文字列で、数字と文字で構成されます。

'234.23432 hel'

したがって、サンプル文字列は次のようになります

 ['0.234 sil', '0.433 dh', '0.822 ax', '1.122 t', '1.45 r', '1.890 ih', '2.302 p']
 end_point = 2.56

各文字列の数字は開始時間 (次の要素の開始時間は前の要素の終了時間をマークします) であり、文字は実際には音素です。私が今達成しようとしているのは、一度に 3 つの音素の時間を計算することです。したがって、最初の要素である から始め'0.234 sil'ます。先行要素がないので、始点は とし0ます。ここで、次の +1 要素 ( ) を見てみます。したがって、からのスパンが'0.822 ax'わかります。次は で、これは にまたがるなどです。後続の +1 要素がない場合、または最後の要素である場合は、代わりに値を使用する必要があります。したがって、最後から 2 番目の結果はの範囲になります。range を持つ最後の要素の場合。sil-dh0-0.822sil-dh-ax0.234-1.122end_pointr-ih-p1.45-2.56ih-p1.890-2.56

理解できることを願っています。これを達成するための「簡単な」方法はありますか?フィルターの一種?

4

1 に答える 1

1

最初にデータを分割する必要があります

l = ['0.234 sil', '0.433 dh', '0.822 ax', '1.122 t', '1.45 r', '1.890 ih', '2.302 p']
val, tok = zip(*map(str.split, l))
val = map(float, val)

その後、たとえば、好きなように組み合わせることができます

tok_from_to = ['-'.join(tok[max(i-3, 0): min(i, len(l))]) for i in range(2, len(l)+2)]
# ['sil-dh', 'sil-dh-ax', 'dh-ax-t', 'ax-t-r', 't-r-ih', 'r-ih-p', 'ih-p']
val_from = [0] + val[:-1]
val_to = val[2:] + [end_point]*2

必要に応じて、結合して戻します。

zip(tok_from_to, val_from, val_to)
# [('sil-dh', 0, 0.822), ('sil-dh-ax', 0.234, 1.122), ('dh-ax-t', 0.433, 1.45), ('ax-t-r', 0.822, 1.89), ('t-r-ih', 1.122, 2.302), ('r-ih-p', 1.45, 2.56), ('ih-p', 1.89, 2.56)]
于 2013-12-09T17:49:21.937 に答える