2013-12-09 1 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 и так далее. Если не осталось ни одного + элемента или это последний элемент, он должен использовать значение end_point. Таким образом, вторым и последним результатом будет r-ih-p с диапазоном 1.45-2.56. Для последнего элемента ih-p с диапазоном 1.890-2.56.

Надеюсь, это понятно. Есть ли «простой» способ достичь этого? Какой-то фильтр?

+0

Дубликат 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