Python: как выровнять два списка, используя временные метки начала и окончания в элементе

У меня есть два списка, каждый из которых отсортирован и не пересекается с другими элементами:

      # (word, start_time, end_time)
words = [('i', 5.12, 5.23),
         ('like', 5.24, 5.36),
         ('you', 5.37, 5.71),
         ('really', 7.21, 7.51),
         ('yes', 8.32, 8.54)]

# (speaker, start_time, end_time)
segments = [('spk1', 0.0, 1.25),
            ('spk2', 4.75, 6.25),
            ('spk1', 6.75, 7.75),
            ('spk2', 8.25, 9.25)]

Я хочу сгруппировать элементы, которые входят в и каждого элемента, и получить что-то вроде этого:

      res = [('i', 'like', 'you'),
       ('really'),
       ('yes')]

так что каждый элемент в res содержит все предметы words с и попадая между start_time а также end_time соответствующего пункта в segments.

2 ответа

Я придумал это решение, когда набирал вопрос. Думаю, stackoverflow - хорошая резиновая уточка. Но я хотел бы услышать, есть ли более эффективный по времени способ.

      res = []
cur = 0
for speaker, start, end in segments:
    sent = []
    for i, (word, word_start, word_end) in enumerate(words[cur:]):
        if word_start >= end:
            cur = cur + i
            break
        sent.append(word)
    res.append((speaker, start, end, round(end - start, 2), " ".join(sent)))
    if len(sent) == len(words[cur:]):
        cur = len(words)

одиночный цикл должен быть быстрым.

      res = [                                         # initialize beforehand
    [
        seg[0], 
        seg[1], 
        seg[2], 
        round(seg[2] - seg[1], 2), 
        '',                                     # with empty speech
     ] for seg in segments
        ]
i = 0                                           # index of res
for word in words:                              # for each row of word
    if word[1] >= res[i][2]:                    # next speaker?
        i = i + 1                               # next res index
    if res[i][4]:                               # not empty speech
        res[i][4] = res[i][4] + ' ' + word[0]   # space in between
    else:                                       # empty speech
        res[i][4] = word[0]                     # initialize it

Счастливое воскресенье!

Другие вопросы по тегам