python - 将键值对划分为 n 组总和 y 或更小的算法
问题描述
我有一个像这样的键值对:
'NANOUSDT.csv.gz': 15,
'ENJUSDT.csv.gz': 19,
'DGBBTC.csv.gz': 0,
'BTSUSDT.csv.gz': 1,
'BLZBTC.csv.gz': 42,
'BANDUSDT.csv.gz': 14,
'ETCUSDT.csv.gz': 202
它包含大约 300 多个项目。有些很大。有些很小。我想创建一个具有以下条件的键列表:
- 列表中值的总和不能超过 10,000
- 列表不能包含超过 8 个元素
没有单个项目的大小超过 10,000。
我怎样才能做到这一点?
解决方案
这是一个例子:
kvs = {'1': 9999,
'2': 19,
'3': 0,
'4': 1,
'5': 42,
'6': 14,
'7': 14,
'8': 14,
'9': 14,
'10': 14,
'11': 10000}
buckets = []
cur_bucket = []
weight_so_far = 0
for k, v in kvs.items():
if len(cur_bucket) == 8 or weight_so_far + v > 10000:
buckets.append(cur_bucket)
cur_bucket = []
weight_so_far = 0
weight_so_far += v
cur_bucket.append(k)
if cur_bucket:
buckets.append(cur_bucket)
print(buckets)
输出
[['1'], ['2', '3', '4', '5', '6', '7', '8', '9'], ['10'], ['11']]
这是你要找的吗?
推荐阅读
- c# - 为什么 HttpClient 不保存基地址,即使它在 Startup 中设置
- javascript - inputSearchValue 不是函数
- python - 转置后如何更改列值?
- google-cloud-platform - 如何将转录的 .wav 完全转换为 txt。- 谷歌语音 API
- badge - 在制作 shield.io 徽章时,有没有办法找到引用徽标名称的正确方法?
- go - 结果如何处理
- css - 如何有效地将 SCSS 转换为 CSS
- reactjs - React 功能组件执行多次,其中 useSelector() 在每个功能组件执行中执行多次
- laravel - 如何在 Laravel 8 中获取作业批次列表
- javascript - 回发后自动禁用文本框