2013-12-09 33 views
0

我想對列表應用一個操作,該列表一次應該包含三個元素。對列表中的當前元素,先行元素和後繼元素的操作

元素是串,它由隨後的數字字符,如

'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 

在每個串的數量的起始時間(下一個元素的開始時間標記了前一個結束時間),而這些字符實際上是音素。我現在想要實現的是計算一次三個音素的時間。 所以我會從第一個元素開始,即'0.234 sil'。由於它沒有任何前面的元素,我假定起始點是0。現在我看看成功的+ 1元素,它是'0.822 ax',因此我知道sil-dh跨度從0-0.822。接下來是sil-dh-ax,其範圍從0.234-1.122,依此類推。 如果沒有成功的+ 1元素或者它是最後一個元素,則應該使用end_point值。所以倒數第二個結果是r-ih-p,範圍爲1.45-2.56。對於範圍爲1.890-2.56的最後一個元素ih-p

我希望這是可以理解的。有沒有一種「簡單」的方法來實現這一目標?某種過濾器?

+0

Duplicate http://stackoverflow.com/questions/5434891/iterate-a-list-as-pair-current-next-in-python –

回答

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)] 
+0

不錯。我喜歡使用'zip'和'map'。 「* map」做了什麼? – cherrun

相關問題