Python订单填充循环?

2024-05-12 12:55:56 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一大堆订单要处理

orders = [39.789032, 36.023618, 3.0539913, 20.0, 1.314, 2.5, 0.401, 1.0, 1.989, 6.3254668, 0.5]

我的起始音量是100

startingvolume = 100

我想遍历订单,直到我的数量/订单被填满

所以第一个订单是我最初的100减去第一个订单39.789032,剩下60.2110968我的订单还有待填补。在我的起始卷为0之前,什么是最适合我的方式来完成我的订单?你知道吗


Tags: 订单数量方式音量ordersstartingvolume
3条回答

NumPy让这变得简单。你知道吗

import numpy as np

def fill(orders, startingvolume):
    orders = np.asarray(orders)
    return orders[orders.cumsum() <= startingvolume]

根据您的示例输入,将返回:

array([ 39.789032 ,  36.023618 ,   3.0539913,  20.       ])

这些都是你完成的订单。要获取剩余的一个部分已填充:

orders[orders.cumsum() >= startingvolume][0]

很多方法,这里有一个:

orders = [39.789032, 36.023618, 3.0539913, 20.0, 1.314, 2.5, 0.401, 1.0, 1.989, 6.3254668, 0.5]
startingvolume = 100

for i in range(len(orders)):
    qty = startingvolume if startingvolume < orders[i] else orders[i]
    orders[i] -= qty
    startingvolume -= qty
    if not startingqty:
        break

这将从每个订单中扣除尽可能多的金额,直到没有剩余为止,然后停止。你知道吗

您可以使用来自itertools模块的combinationsmax()来解决问题,如下示例:

from itertools import combinations

orders = [39.789032, 36.023618, 3.0539913, 20.0, 1.314, 2.5, 0.401, 1.0, 1.989, 6.3254668, 0.5]
startingvolume = 100

sub = []
for k in range(1, len(orders)):
    sub.append(max([[j, sum(j)] for j in combinations(orders, k) if sum(j) <= startingvolume], key = lambda x: x[1]))

best_order, fill_max = max(sub, key = lambda x: x[1])
print("best order is: {}\nMax to fill from starting volume is: {}"
                                    .format(best_order, fill_max))

输出:

best order is: (39.789032, 36.023618, 3.0539913, 20.0, 1.0)
Max to fill from starting volume is: 99.86664

相关问题 更多 >