Python 基于最大和最小范围内的项目值的字典列表

Python 基于最大和最小范围内的项目值的字典列表,python,arraylist,list-comprehension,Python,Arraylist,List Comprehension,因此,我有一个字典列表,它以字典列表的形式构成框架信息。列表按帧编号键排序 [ { "frame_num": "1","width": "1920","height":"1080","other_info": "some_info" }, { "frame_num": "2",&qu

因此,我有一个字典列表,它以字典列表的形式构成框架信息。列表按帧编号键排序

[
    { "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" },
]
一种可能的方法是借助列表理解。但是我想要一个有效的方法,因为这个列表可能有数百万帧信息
我希望得到一些类似python的方法来实现这一点。

我假设最后一帧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'}]
别担心,在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]
现在,您可以找到具有以下内容的元素:


谢谢,@jferard。这个答案确实帮助我更多地了解python。“继续开导吧!”罗珊乔汉很乐意帮忙。如果你认为这回答了你的问题,请接受我的回答,这是对StackOverflow表示感谢的另一种方式。
import bisect
f = bisect.bisect_left(nums, 4)
t = bisect.bisect_left(nums, 14)
selected_frames = frames[f:t]