对列表中的当前,先前和后续元素的操作

时间:2013-12-09 17:14:07

标签: python list phoneme

我想在列表中应用一个操作,该列表应该一次跨越三个元素。

元素是字符串,由数字和字符组成,如

'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。对于范围为ih-p的最后一个元素1.890-2.56

我希望这是可以理解的。有一种'简单'的方法来实现这一目标吗?某种过滤器?

1 个答案:

答案 0 :(得分: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)]