Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何根据说话人姓名总结时间戳列表v.2_Python_Arrays_Python 3.x_Algorithm_Datetime - Fatal编程技术网

Python 如何根据说话人姓名总结时间戳列表v.2

Python 如何根据说话人姓名总结时间戳列表v.2,python,arrays,python-3.x,algorithm,datetime,Python,Arrays,Python 3.x,Algorithm,Datetime,我在做一个项目 我从列表中提取了数据,现在有3个列表: 列表1-演讲者姓名列表 ['<M1>', '<M1>', '<M1>', '<M1>', '<M1>', '<M2>', '<M2>', '<M2>', '<M1>', '<M1>', '<M2>', '<M1>', '<M2>', '<M2>', '<M2>'

我在做一个项目 我从列表中提取了数据,现在有3个列表:
列表1-演讲者姓名列表

['<M1>', '<M1>', '<M1>', '<M1>', '<M1>', '<M2>', '<M2>', '<M2>', '<M1>', '<M1>', '<M2>', '<M1>', '<M2>', '<M2>', '<M2>', '<M2>', '<M2>']
列表3-结束通话时间戳的列表

['[00:00:08.010]', '[00:00:16.290]', '[00:00:26.210]', '[00:00:39.980]', '[00:00:48.100]', '[00:00:56.770]', '[00:01:08.010]', '[00:01:20.250]', '[00:01:33.850]', '[00:01:47.150]', '[00:01:49.370]', '[00:01:50.140]', '[00:02:01.350]', '[00:02:16.010]', '[00:02:20.150]', '[00:02:27.610]', '[00:02:39.040]'] 
我需要做的是每当一个演讲者讲了很多次(例如列表的前5个元素) 我需要将第一个结束段[00:00:08.010]更改为[00:00:48.100],并删除中间的所有条目(将有一个说话者的5个条目改为1个条目) 然后对列表中的所有发言者再次执行此操作。 如果演讲者只说了一次,那么它需要保持不变

我还有一条我需要遵守的规则,我不知道如何执行, 如果有人直截了当地讲了5遍(如开头的例子),那么就有了 在第4句和第5句之间超过0.5秒 结果应该是两个输入 比如说

['<M1>', '<M1>']
但它不看时间,只看演讲者的第一次和最后一次讲话的时间,不分开,以防时间间隔相差0.5秒

<M1> [00:00:00.000]     [00:00:39.980]
<M1> [00:00:40.600]     [00:00:48.100]
[00:00:00.000][00:00:39.980]
[00:00:40.600]     [00:00:48.100]
而不是

<M1> [00:00:00.000]    [00:00:48.100]
[00:00:00.000][00:00:48.100]

给定这些容器和以下假设:

  • 清单1总是有序的
  • 列表1、2和3的长度始终相等
  • 列表1、2和3是垂直相关的
然后您可以执行以下操作:

from itertools import groupby

speaker_times = {}

for speaker, timestamps in groupby(enumerate(list_1), key=lambda x: x[1]):
    start = timestamps[0][0]  # start time recorded
    end = timestamps[-1][0]  # end time recorded
    speaker_times[speaker] = [list_2[start], list_3[end]]
这将通过
将列表压缩到字典中,格式如下:

:[开始时间,结束时间]


问题的第二部分令人困惑,你能否编辑你的原始帖子,进一步澄清你所说的0.5秒间隔是什么意思?您显示
00.00.00-00.00.39
00.00.39-00.00.48
,但这两个都不是
00.00.05
间隙(假设格式为
hh.mm.ss
)。

要处理扬声器段中0.5秒的间隙,您需要将开始时间和结束时间转换为
datetime
对象,并将当前
start
值与以前的
end
值进行比较,当扬声器发生变化或间隔大于等于0.5秒时,启动新的片段:

from datetime import datetime
import itertools

speakers = ['<M1>', '<M1>', '<M1>', '<M1>', '<M1>', '<M2>', '<M2>', '<M2>', '<M1>', '<M1>', '<M2>', '<M1>', '<M2>', '<M2>', '<M2>', '<M2>', '<M2>']
start = ['[00:00:00.000]', '[00:00:08.010]', '[00:00:16.890]', '[00:00:26.210]', '[00:00:39.980]', '[00:00:48.100]', '[00:00:56.770]', '[00:01:08.010]', '[00:01:21.120]', '[00:01:46.130]', '[00:01:47.180]', '[00:01:49.390]', '[00:01:50.670]', '[00:02:02.320]', '[00:02:16.010]', '[00:02:21.110]', '[00:02:27.610]']
end = ['[00:00:08.010]', '[00:00:16.290]', '[00:00:26.210]', '[00:00:39.980]', '[00:00:48.100]', '[00:00:56.770]', '[00:01:08.010]', '[00:01:20.250]', '[00:01:33.850]', '[00:01:47.150]', '[00:01:49.370]', '[00:01:50.140]', '[00:02:01.350]', '[00:02:16.010]', '[00:02:20.150]', '[00:02:27.610]', '[00:02:39.040]'] 

# convert times to datetime objects
startt = [datetime.strptime(t, '[%H:%M:%S.%f]') for t in start]
endt = [datetime.strptime(t, '[%H:%M:%S.%f]') for t in end]

newSpeakerOrder = []
newSpeakerBegin = []
newSpeakerEnd   = []

currentspeaker = None
currentend = datetime.fromtimestamp(0)
for i in range(len(speakers)):
    if currentspeaker != speakers[i] or (startt[i] - currentend).total_seconds() >= 0.5: 
        if currentspeaker != None and currentend != None:
            newSpeakerEnd.append(end[i - 1])
        newSpeakerOrder.append(speakers[i])
        newSpeakerBegin.append(start[i])
    currentspeaker = speakers[i]
    currentend = endt[i]
newSpeakerEnd.append(end[-1])

print([(s, b, e) for s, b, e in zip(newSpeakerOrder, newSpeakerBegin, newSpeakerEnd)])
从日期时间导入日期时间
进口itertools
发言人=['','','','','','','','','','','','','','','','','','']
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,00:02:21.110],“[00:02:27.610]”
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,[00:02:39.040]]
#将时间转换为日期时间对象
startt=[datetime.STRTIME(t,[%H:%M:%S.%f]'),用于开始中的t]
endt=[datetime.strtime(t,[%H:%M:%S.%f]'),用于结尾中的t]
NewspeakErrorder=[]
newSpeakerBegin=[]
newSpeakerEnd=[]
currentspeaker=无
currentend=datetime.fromtimestamp(0)
对于范围内的i(len(扬声器)):
如果当前扬声器!=扬声器[i]或(开始[i]-currentend)。总秒数()>=0.5:
如果当前扬声器!=无和currentend!=无:
newSpeakerEnd.append(end[i-1])
newSpeakerOrder.append(发言者[i])
newSpeakerBegin.append(开始[i])
currentspeaker=扬声器[i]
currentend=endt[i]
newSpeakerEnd.append(结束[-1])
打印([(s,b,e)用于s,b,e的拉链(Newspeakorder,newSpeakerBegin,NewspeakerRend)])
输出:

[
 ('<M1>', '[00:00:00.000]', '[00:00:16.290]'),
 ('<M1>', '[00:00:16.890]', '[00:00:48.100]'),
 ('<M2>', '[00:00:48.100]', '[00:01:20.250]'),
 ('<M1>', '[00:01:21.120]', '[00:01:33.850]'),
 ('<M1>', '[00:01:46.130]', '[00:01:47.150]'),
 ('<M2>', '[00:01:47.180]', '[00:01:49.370]'),
 ('<M1>', '[00:01:49.390]', '[00:01:50.140]'),
 ('<M2>', '[00:01:50.670]', '[00:02:01.350]'),
 ('<M2>', '[00:02:02.320]', '[00:02:20.150]'),
 ('<M2>', '[00:02:21.110]', '[00:02:39.040]')
]
[
('', '[00:00:00.000]', '[00:00:16.290]'),
('', '[00:00:16.890]', '[00:00:48.100]'),
('', '[00:00:48.100]', '[00:01:20.250]'),
('', '[00:01:21.120]', '[00:01:33.850]'),
('', '[00:01:46.130]', '[00:01:47.150]'),
('', '[00:01:47.180]', '[00:01:49.370]'),
('', '[00:01:49.390]', '[00:01:50.140]'),
('', '[00:01:50.670]', '[00:02:01.350]'),
('', '[00:02:02.320]', '[00:02:20.150]'),
('', '[00:02:21.110]', '[00:02:39.040]')
]

为了澄清这一点,如果一个演讲者连续多次出现,你不想简单地总结他所有的演讲时间,如果两次出现之间有延迟,你也可以将其分成演讲时间块?如果同一演讲者的两次出现之间的延迟超过0.5秒,这些人没有这个差距,但我被告知,我将得到的未来名单将有这个差距,正因为如此,我需要为未来添加这个选项entries@MichaelBenHaym这仍然没有意义,因为您说过“……是一个超过0.5秒的空间……”,
list_3
中的许多时间戳的间隔大于0.5秒。因此,我再次敦促你用一个例子来更新你的原始帖子。最初,我的脚本将其相加为1个M1条目,秒数为0.00.00-0.00.48,但我希望输出为两个M1条目,其中一个条目的起点,如果第一个的结束时间与第二个的开始时间相差0.5秒,则结束时间为00.00.00-00.00.39,第二个为00.00.39-00.00.48gap@MichaelBenHaym因此,
最多有2个条目?也就是说,如果一个演讲者多次出现,并且第二个到最后一个和最后一个结束时间戳之间的差值为0.5秒,那么结果应该是
[(“”,开始到第二个到最后一个到结束时间),(“”,第二个到最后一个到结束时间)]
?你的问题令人困惑的原因是,你将
00.00.00
设置为
00.00.39
,间隔0.5秒;但是如果你只想要最多2个条目,那么这是可行的。我试着编辑并添加了一个例子,不应该有最多的条目,但以防万一
from datetime import datetime
import itertools

speakers = ['<M1>', '<M1>', '<M1>', '<M1>', '<M1>', '<M2>', '<M2>', '<M2>', '<M1>', '<M1>', '<M2>', '<M1>', '<M2>', '<M2>', '<M2>', '<M2>', '<M2>']
start = ['[00:00:00.000]', '[00:00:08.010]', '[00:00:16.890]', '[00:00:26.210]', '[00:00:39.980]', '[00:00:48.100]', '[00:00:56.770]', '[00:01:08.010]', '[00:01:21.120]', '[00:01:46.130]', '[00:01:47.180]', '[00:01:49.390]', '[00:01:50.670]', '[00:02:02.320]', '[00:02:16.010]', '[00:02:21.110]', '[00:02:27.610]']
end = ['[00:00:08.010]', '[00:00:16.290]', '[00:00:26.210]', '[00:00:39.980]', '[00:00:48.100]', '[00:00:56.770]', '[00:01:08.010]', '[00:01:20.250]', '[00:01:33.850]', '[00:01:47.150]', '[00:01:49.370]', '[00:01:50.140]', '[00:02:01.350]', '[00:02:16.010]', '[00:02:20.150]', '[00:02:27.610]', '[00:02:39.040]'] 

# convert times to datetime objects
startt = [datetime.strptime(t, '[%H:%M:%S.%f]') for t in start]
endt = [datetime.strptime(t, '[%H:%M:%S.%f]') for t in end]

newSpeakerOrder = []
newSpeakerBegin = []
newSpeakerEnd   = []

currentspeaker = None
currentend = datetime.fromtimestamp(0)
for i in range(len(speakers)):
    if currentspeaker != speakers[i] or (startt[i] - currentend).total_seconds() >= 0.5: 
        if currentspeaker != None and currentend != None:
            newSpeakerEnd.append(end[i - 1])
        newSpeakerOrder.append(speakers[i])
        newSpeakerBegin.append(start[i])
    currentspeaker = speakers[i]
    currentend = endt[i]
newSpeakerEnd.append(end[-1])

print([(s, b, e) for s, b, e in zip(newSpeakerOrder, newSpeakerBegin, newSpeakerEnd)])
[
 ('<M1>', '[00:00:00.000]', '[00:00:16.290]'),
 ('<M1>', '[00:00:16.890]', '[00:00:48.100]'),
 ('<M2>', '[00:00:48.100]', '[00:01:20.250]'),
 ('<M1>', '[00:01:21.120]', '[00:01:33.850]'),
 ('<M1>', '[00:01:46.130]', '[00:01:47.150]'),
 ('<M2>', '[00:01:47.180]', '[00:01:49.370]'),
 ('<M1>', '[00:01:49.390]', '[00:01:50.140]'),
 ('<M2>', '[00:01:50.670]', '[00:02:01.350]'),
 ('<M2>', '[00:02:02.320]', '[00:02:20.150]'),
 ('<M2>', '[00:02:21.110]', '[00:02:39.040]')
]