python 按照给定比例分配账单到各个成本中心算法

groups = {'a':100, 'b':10, 'c':23, 'd':23, 'e':12, 'f':34, 'g':67, 'h':135, 'i':5, 'j':39, 'k':60, 'l':204}
percents = [45, 20,20, 15]
n = 4
# 计算后
split_words = [320 , 142, 142, 106]
split_keys = ['33710' , '33720', '33730', '33740']
import numpy as np

def split(groups, split_words):
    n = len(split_words)

    groups_sorted = {}
    tmpzip = sorted(groups.items(), key=lambda x: x[1], reverse=True)
    for tuple_ in tmpzip:
        groups_sorted[tuple_[0]] = tuple_[1]
    values = [i for i in groups_sorted.values()]
    keys = [i for i in groups_sorted.keys()]

    print (values, "length:", len(values),'sum:',sum(values))
    print (keys, "length:", len(keys))
    groups = []
    for index in range(n):
        standard = split_words[index]
        if index == (n-1):
            groups.append(list(zip(keys,values)))
            return groups
        else:
            for ind_bg,value in enumerate(values):
                if value > standard:
                    group = [(keys[ind_bg],value)]
                    groups.append(group)
                    del values[ind_bg]
                    del keys[ind_bg]
                    break
                else:
                    group = [(keys[ind_bg],value)]
                    del values[ind_bg]
                    del keys[ind_bg]
                    print('valbg:',values)
                    print('keybg:',keys)
                    delta =standard-value
                    for ind_sm,i in enumerate(values):
                        # print ("searching in :", i)
                        if i <= delta:
                            group.append((keys[ind_sm],i))
                            del values[ind_sm]
                            del keys[ind_sm]
                            print('valsm:', values, ind_sm)
                            print('keysm:', keys, ind_sm)
                            delta -= i
                    groups.append(group)
                    break
if __name__ == '__main__':
    gg = split(groups,  split_words)
    print(gg)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值