如何对含字典列表的Python字典实现高效分页?
Python嵌套字典列表的高效分页实现
要实现嵌套结构(外层为字典,值为字典列表)的跨设备分页,避免预扁平化所有数据是性能最优的核心思路——如果数据量极大,预扁平化会占用大量内存,按需遍历计算才能保证内存效率与执行速度。
实现代码
def paginate_nested_dict(data, page, page_size): if page < 1 or page_size < 1: raise ValueError("页码和页大小必须大于0") # 计算需要跳过的元素总数 offset = (page - 1) * page_size result = {} # 记录还需要取多少条数据 remaining = page_size for device, items_list in data.items(): list_len = len(items_list) # 如果当前列表长度小于偏移量,直接跳过整个列表,更新偏移量 if offset >= list_len: offset -= list_len continue # 计算从当前列表需要取的元素数量 take_count = min(list_len - offset, remaining) selected_items = items_list[offset:offset + take_count] # 将选中元素加入结果 result[device] = selected_items # 更新剩余需要取的数量,取够则提前终止循环 remaining -= take_count if remaining <= 0: break return result
性能优势
- 低内存占用:无需预先合并所有数据为大列表,仅在遍历过程中按需提取元素,适合超大规模数据集
- 高效遍历:取够所需数据后立即终止循环,避免不必要的遍历操作
- 时间复杂度低:仅涉及简单的索引切片与数值计算,实际执行复杂度为O(k)(k为需要遍历的设备数+取出的元素数)
示例验证
先定义测试数据:
items = { "device-1": [ {"a": 1, "b": 15}, {"a": 11, "b": 25}, {"a": 21, "b": 35}, {"a": 31, "b": 45} ], "device-2": [ {"a": 100, "b": 150}, {"a": 110, "b": 250}, {"a": 210, "b": 350}, {"a": 310, "b": 450} ] }
测试Page=1,PageSize=3
page1 = paginate_nested_dict(items, page=1, page_size=3) print(page1) # 输出: # {'device-1': [{'a': 1, 'b': 15}, {'a': 11, 'b': 25}, {'a': 21, 'b': 35}]}
测试Page=2,PageSize=3
page2 = paginate_nested_dict(items, page=2, page_size=3) print(page2) # 输出: # {'device-1': [{'a': 31, 'b': 45}], 'device-2': [{'a': 100, 'b': 150}, {'a': 110, 'b': 250}]}
边界测试(Page=3,PageSize=3)
总数据共8条,第三页仅剩余2条:
page3 = paginate_nested_dict(items, page=3, page_size=3) print(page3) # 输出: # {'device-2': [{'a': 210, 'b': 350}, {'a': 310, 'b': 450}]}
内容的提问来源于stack exchange,提问作者N Raghu
相关产品推荐
相关产品推荐

