根据最大和最小范围内的项目值拆分字典列表

Spllit list of dictionaries on the basis of item values in max and min range

所以,我有一个字典列表,以字典列表的形式构成框架信息。列表按“frame_num”键

排序
[
    { "frame_num": "1","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "2","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "3","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "4","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "6","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "8","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "10","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "15","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "16","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "18","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "20","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "22","width": "1920","height":"1080","other_info": "some_info" }
]

所以,我想获取 frame_num 值在 4:14 范围内的帧列表,这是具有此范围的列表的一部分 我的回答是

[
    { "frame_num": "4","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "6","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "8","width": "1920","height":"1080","other_info": "some_info" },
    { "frame_num": "10","width": "1920","height":"1080","other_info": "some_info" },
]

一种可能的方法是借助列表理解。但我想要一种有效的方法,因为这个列表可能有数百万帧信息 我希望得到一些 pythonic 的方式来做到这一点。

我假设最后一帧 (12) 是错字,因为您没有在输出中考虑它。

通过列表理解,这相当容易。首先,定义范围

r = range(4, 14)

然后,使用列表理解的过滤器来选择框架:

selected_frames = [f for f in frames if int(f["frame_num"]) in r]
# [{'frame_num': '4', 'width': '1920', 'height': '1080', 'other_info': 'some_info'}, {'frame_num': '6', 'width': '1920', 'height': '1080', 'other_info': 'some_info'}, {'frame_num': '8', 'width': '1920', 'height': '1080', 'other_info': 'some_info'}, {'frame_num': '10', 'width': '1920', 'height': '1080', 'other_info': 'some_info'}]

别担心,in r。但转换为 int 需要一些时间。


如果您的帧是有序的并且范围是连续的(无步长),您可以使用常规循环并在退出范围时中断:

selected_frames = []
for f in frames:
    if int(f["frame_num"]) in r:
        selected_frames.append(f)
    elif selected_frames: # not in range anymore
        break

(如果您有步骤,您仍然可以设法测试范围边界,然后应用该步骤。)

我有几个范围可以从同一个框架列表中获取,也许索引该列表可能是一个主意:

nums = [int(f["frame_num"]) for f in frames]
# [1, 2, 3, 4, 6, 8, 10, 15, 16, 18, 20]

您现在可以找到带有 bisect:

的元素
import bisect
f = bisect.bisect_left(nums, 4)
t = bisect.bisect_left(nums, 14)
selected_frames = frames[f:t]