You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何拆分列表中超出字节阈值的字典内整数列表以满足限制?

拆分字典列表中超出字节限制的整数列表

我有一个结构统一的字典列表,每个字典内包含一个整数列表。要求确保每个字典转换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 08:19:54