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
Счастливое воскресенье!