比较Python中的索引值,以便I';I’我不会经常重复If语句
我正在用Python开发一个应用程序,它获取一个程序提供的列表,并尝试处理文本以进行闭路字幕显示。我使用IBM Watson转录音频文件,然后返回一个JSON,其中包含转录的单词和一个时间戳,该时间戳记录每个单词的开始时间和结束时间。下面是一个小例子,说明这些数据是什么样子的。(注意:我简化了JSON响应,因此只突出显示了适用于此问题的部分数据) 我只对'section'中每个列表的单词(0-index0)和开始时间(1-index)感兴趣 对于封闭式字幕,我的目标是每2.5秒捕获一组单词,并且只标记该集合中第一个单词的时间戳。因此,在上面提供的示例中,提供的第一个索引将是我的“零标记”在2.5秒内出现的每个单词都将被收集到一个短语中。之后的任何数据都将遵循相同的逻辑——对于所有数据,将2.5秒内出现的单词分组,并标记集合中第一个单词的时间戳 然而,由于我无法预测文件的持续时间,也无法预测沃森将如何转录这些文件,因此我很难找出处理2.5秒要求的识别词组的最佳方法 以下是我写的:比较Python中的索引值,以便I';I’我不会经常重复If语句,python,python-3.x,list,conditional,Python,Python 3.x,List,Conditional,我正在用Python开发一个应用程序,它获取一个程序提供的列表,并尝试处理文本以进行闭路字幕显示。我使用IBM Watson转录音频文件,然后返回一个JSON,其中包含转录的单词和一个时间戳,该时间戳记录每个单词的开始时间和结束时间。下面是一个小例子,说明这些数据是什么样子的。(注意:我简化了JSON响应,因此只突出显示了适用于此问题的部分数据) 我只对'section'中每个列表的单词(0-index0)和开始时间(1-index)感兴趣 对于封闭式字幕,我的目标是每2.5秒捕获一组单词,并且
# use the tag variable to identify the start time of the
# first word outside of 2.5 seconds
tag = 0
# use the first index's start time as the benchmark for 2.5 second duration
benchmark = section[0][1]
for i in range(len(section)):
if abs(benchmark - section[i][1]) < 2.5:
# do stuff
foo(bar)
# update tag variable to identify first start time
# for word outside of 2.5 seconds. This will
# continue to update until the if statement is no longer true.
if (i + 1) < len(section):
tag = section[i + 1][1]
else:
# use tag to create new benchmark
benchmark = tag
if abs(benchmark - section[i][1]) < 2.5:
# do stuff
任何帮助、指导、建议等都将不胜感激。谢谢!这里有一种方法,可以在列表中每隔2.5秒重复一次并输出短语。它是否适合您的需要
start = section[0][1]
end = section[-1][1]
for mark in range(0, int((end-start)/2.5)+1):
phrase = [(x[0],x[1]) for x in section if int((x[1]-start)/2.5)==mark]
print([' '.join((word for word, mark in phrase)), phrase[0][1]])
这是一个,有一个
- 生产者:产生单个项目的
序列部分
- 使用者:将传入项累积到块中并在块准备好后返回该块的逻辑。
- 由于该算法按原样一个接一个地返回块,因此它自然成为一个生成器
- 首先检查我们是否也在积累或返回
- 如果返回,则返回区块并重置它
- 然后,如果区块不为空,则追加该项;如果为空,则初始化该项
- 最后,当序列结束时,返回最后一个挂起的块(如果有)
None
比某些特定值更方便地指示块未初始化:1)使用真值测试快速检查块;2) 我们必须复制初始化代码,因此避免了复制一些自定义值;3) 该项不存在“神奇”初始值1
def gen_captions(section):
item = None
for word, start, _ in section:
if item:
if start - item['time'] >= 2.5:
yield item
item = None
else:
item['phrase']+=' '+word
if not item:
item = {'phrase':word,'time':start}
else:
if item: yield item
1以某种方式调制的某个值将通过预期方式的检查,并在第一次迭代时自动被“正常”值覆盖。
在某些算法中,存在这样一个值:例如,当选择最大数时,初始结果可以设置为可能的最小数。在这里,我们从不覆盖时间,所以“自动覆盖”是不可能的。这是有效的!非常感谢。我以前没有见过您用于第5行的方法实现。很高兴知道。再次感谢。
start = section[0][1]
end = section[-1][1]
for mark in range(0, int((end-start)/2.5)+1):
phrase = [(x[0],x[1]) for x in section if int((x[1]-start)/2.5)==mark]
print([' '.join((word for word, mark in phrase)), phrase[0][1]])
def gen_captions(section):
item = None
for word, start, _ in section:
if item:
if start - item['time'] >= 2.5:
yield item
item = None
else:
item['phrase']+=' '+word
if not item:
item = {'phrase':word,'time':start}
else:
if item: yield item