这是词典列表。
segments2 = [
{
"endTime": "01:09:02;00",
"duration": "00:09:02:00",
"startTime": "00:59:59;29",
},
{
"endTime": "01:13:01:10",
"duration": "00:05:20:00",
"startTime": "01:09:17;05",
},
{ #-> Segment 4
"endTime": "01:21:33;21", #-> 01:15:20:19
"duration": "00:06:42:00", #-> Segment 5 ST -> End time of Segment 3 + 1 Frame -> 01:15:20:20 (HH:MM:SS:FF)
"startTime": "01:14:51;22", #-> Segment 5 End
},
]
这里是一本字典,我正在将每个分段字典与之比较。
change_time = {
"startTime" : "01:15:20:19",
"duration":"00:00:05:00",
"endTime" : "01:15:25:19"
}
好奇地想知道是否有更好的方法可以将segment
列表中的每个segments2
字典与此字典change_time
进行比较。我不认为这是最有效的方法。
for index,segment in enumerate(segments):
for segment_key, segment_value in segment.items():
for change_time_key,change_time_value in change_time.items():
if index < total_segments-1:
if segment_key == 'startTime' and change_time_key == 'startTime' and segment_value == change_time_value:
segment_time_code = segment['duration']
答案 0 :(得分:1)
Python中的点允许您将==
与它们一起使用。我将change_time
添加到segments2
的末尾并运行以下代码:
[change_time == d for d in segments2]
它返回:
[False, False, False, True]
如果只想检查一个字段,则可以指定它:
[change_time['startTime'] == d['startTime'] for d in segments2]
然后,您将获得所有具有相等字典的索引。或者,您也可以运行以下命令:
change_time in segments2
在这种情况下将返回True
。
答案 1 :(得分:1)
据我所知,您的循环可以简化为
for segment in segments[:total_segments-1]:
if segment['startTime'] == change_time['startTime']:
segment_time_code = segment['duration']
答案 2 :(得分:0)
如果需要执行多次查找,则可以创建字典startTime -> list of segments
:
>>> d= {}
>>> for s in segments2:
... d.setdefault(s["startTime"], []).append(s)
>>> d
{'00:59:59;29': [{'endTime': '01:09:02;00', 'duration': '00:09:02:00', 'startTime': '00:59:59;29'}], '01:09:17;05': [{'endTime': '01:13:01:10', 'duration': '00:05:20:00', 'startTime': '01:09:17;05'}], '01:14:51;22': [{'endTime': '01:21:33;21', 'duration': '00:06:42:00', 'startTime': '01:14:51;22'}]}
然后使用字典查找在给定时间开始的所有段:
>>> d[change_time["startTime"]]
Traceback (most recent call last):
...
KeyError: '01:15:20:19'
>>> d['01:09:17;05']
[{'endTime': '01:13:01:10', 'duration': '00:05:20:00', 'startTime': '01:09:17;05'}]
如果要比较时间(更大或更短),可以对segments2
列表进行排序并使用bisect
:
>>> segments3 = sorted(segments2, key=lambda s: s.get("startTime"))
>>> segments3
[{'endTime': '01:09:02;00', 'duration': '00:09:02:00', 'startTime': '00:59:59;29'}, {'endTime': '01:13:01:10', 'duration': '00:05:20:00', 'startTime': '01:09:17;05'}, {'endTime': '01:21:33;21', 'duration': '00:06:42:00', 'startTime': '01:14:51;22'}]
>>> import bisect
>>> bisect.bisect_left([s["startTime"] for s in segments3], '01:10:13;07')
2
键位于段1
和2
之间
>>> segments3[1]
{'endTime': '01:13:01:10', 'duration': '00:05:20:00', 'startTime': '01:09:17;05'}
>>> segments3[2]
{'endTime': '01:21:33;21', 'duration': '00:06:42:00', 'startTime': '01:14:51;22'}