如何拆分列表中超出字节阈值的字典内整数列表以满足限制?
拆分字典列表中超出字节限制的整数列表
我有一个结构统一的字典列表,每个字典内包含一个整数列表。要求确保每个字典转换为JSON字符串后的字节大小不超过指定阈值;若字典超出该阈值,则拆分其内部的整数列表,生成多个符合字节限制的字典。
我的尝试代码
import json payload: list[dict] = [ {"data1": [1,2,3,4]}, {"data2": [8,9,10]}, {"data3": [1,2,3,4,5,6,7]} ] # 允许的最大字节大小,这是固定的硬限制,不可更改。 MAX_SIZE: int = 25 def check_and_chunk(arr: list): def check_size_bytes(item): return len(json.dumps(item).encode("utf-8")) > MAX_SIZE def chunk(item, num_chunks: int=2): for i in range(0, len(item), num_chunks): yield item[i:i+num_chunks] # 首先检查整个payload是否小于MAX_SIZE if not check_size_bytes(arr): return arr # 分别找出小字典和大字典 small, big = [], [] # 找出payload中过大的字典的索引 big_idx: list = [i for i, j in enumerate(list(map(check_size_bytes, arr))) if j] # 将这些项分别添加到对应的列表中 item_append = (small.append, big.append) for i, item in enumerate(arr): item_append[i in set(big_idx)](item) # 修改大字典,直到它们足够小可以移入small列表 for i in big: print(i) # 此处不确定如何继续,希望拆分big列表中的大字典,使每个元素都能加入small列表
期望结果
payload: list[dict] = [ {"data1": [1,2,3,4]}, {"data2": [8,9,10]}, {"data3": [1,2,3,4]}, {"data3": [5,6,7]} ]
完整解决方案
下面是补全后的实现代码,核心是通过试探法找到每个子列表的最大长度,确保生成的字典不超过字节限制:
import json payload: list[dict] = [ {"data1": [1,2,3,4]}, {"data2": [8,9,10]}, {"data3": [1,2,3,4,5,6,7]} ] # 允许的最大字节大小,固定硬限制 MAX_SIZE: int = 25 def check_and_chunk(arr: list): def check_size_bytes(item): return len(json.dumps(item).encode("utf-8")) > MAX_SIZE def split_list_to_fit(key: str, num_list: list): chunked = [] start = 0 total_len = len(num_list) while start < total_len: # 从当前位置开始,逐步增加元素数量,直到超过阈值 end = start + 1 while end <= total_len: test_dict = {key: num_list[start:end]} if check_size_bytes(test_dict): end -= 1 break end += 1 else: # 遍历到列表末尾都没超阈值,直接取到最后 end = total_len # 添加符合要求的子字典 chunked.append({key: num_list[start:end]}) start = end return chunked result = [] for item in arr: if not check_size_bytes(item): result.append(item) continue # 提取字典中的唯一键和整数列表(符合结构统一的前提) key, num_list = next(iter(item.items())) # 拆分后将所有子字典加入结果 result.extend(split_list_to_fit(key, num_list)) return result # 执行处理并打印结果 processed_payload = check_and_chunk(payload) print(json.dumps(processed_payload, indent=2))
关键说明
- 函数
split_list_to_fit:针对超标字典的整数列表,从单个元素开始逐步扩展,找到每个子列表的最大长度,确保生成的新字典字节数不超过阈值。 - 遍历原列表时,直接判断每个字典是否超标:不超标直接保留,超标则拆分其整数列表生成多个合规字典。
- 基于每个字典仅含一个键值对的结构前提实现,符合题目中"结构统一"的要求。
内容的提问来源于stack exchange,提问作者Coldchain9
相关产品推荐
相关产品推荐

