比较Python中的索引值,以便I';I’我不会经常重复If语句

比较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秒捕获一组单词,并且

我正在用Python开发一个应用程序,它获取一个程序提供的列表,并尝试处理文本以进行闭路字幕显示。我使用IBM Watson转录音频文件,然后返回一个JSON,其中包含转录的单词和一个时间戳,该时间戳记录每个单词的开始时间和结束时间。下面是一个小例子,说明这些数据是什么样子的。(注意:我简化了JSON响应,因此只突出显示了适用于此问题的部分数据)

我只对'section'中每个列表的单词(0-index0)和开始时间(1-index)感兴趣

对于封闭式字幕,我的目标是每2.5秒捕获一组单词,并且只标记该集合中第一个单词的时间戳。因此,在上面提供的示例中,提供的第一个索引将是我的“零标记”在2.5秒内出现的每个单词都将被收集到一个短语中。之后的任何数据都将遵循相同的逻辑——对于所有数据,将2.5秒内出现的单词分组,并标记集合中第一个单词的时间戳

然而,由于我无法预测文件的持续时间,也无法预测沃森将如何转录这些文件,因此我很难找出处理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