想知道是否有更好的方法遍历字典列表并将键与另一个字典键进行比较

时间:2019-05-08 13:51:17

标签: python list dictionary

这是词典列表。

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']

3 个答案:

答案 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

键位于段12之间

>>> 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'}