列表元素的总和,直到限制

时间:2019-09-22 17:11:43

标签: python

我遇到一个问题,我需要我的代码添加列表元素,直到总和尽可能接近常量为止。达到常数后,我需要代码来存储总和以及索引的总和(计算达到该总和需要多少个变量)。我是Python的初学者,这个问题让我很难受。

我尝试了while循环和for循环。那时,我有点困惑,不确定我的方法是否正确。

这是逻辑的具体示例。假设周期1的需求为10,周期2的需求为23,Q为12(此处Q表示最优数量)。我想弄清楚的是,我们是否应该在包含需求1 + 2的需求的期间1下订单,还是最好在期间1下订单1,在期间2下订单更好?时期1的需求接近Q或时期1 + 2的累积需求接近Q。在此示例中,| 10-12 | <|(10 + 23)-12 |,因此我们要记录期间1的订单,以及另一期间2的订单。

def feeoq(q, demand):
    sum = 0
    prod = []

    for i in demand:
        sum = sum + i
        if abs(sum - q) < abs(sum + i - q):
            return prod.append(sum)

        else:
            sum = sum + i

我没有收到错误消息,但是该函数未返回我期望的结果。

3 个答案:

答案 0 :(得分:1)

您已重复sum = sum + i行。在循环开始时一次,然后在else条件下。我想您应该删除第一条加法行并追加sum + i。

答案 1 :(得分:0)

也许我们可以将其作为讨论的基础:

import numpy as np

np.random.seed(42)

L = np.random.randint(0, 10, 10)
q = 7

print(L)

def subs(L, q):
    sum = 0
    for i, e in enumerate(L):
        sum += e
        if sum > q:
            if abs(sum - q) > abs(sum - e - q):
                r = sum - e
                sum = e
                n = i - 1
            else:
                r = sum
                sum = 0
                n = i
            yield n, r
    yield i, sum

print(list(subs(L, q)))

说明:

基本上,此功能首先检查sum是否大于q。仅当是时,您才具有两个值,两个值都不小于或大于q。这是您进行测试的先决条件,两者中的一个到q的距离更短。
现在,根据哪个更接近q,该函数将返回sumsum - e

现在,在代码中使用 yield 时,我在这里使用动词 return :这不是通常的函数,而是generator。关于此类函数的主要线索是,当它们 yield 一个值时,您可以像第一步一样思考返回值,但有一个重要区别: function 本身不会返回(即不结束),但是会进入睡眠状态,等待下一次调用,并保持其完整状态(包括到目前为止计算的所有值),然后在下一个继续执行在 yield 之后的行,好像之前没有发生任何事情一样-直到下一个 yield 关键字。

简而言之:如果您想总结直到任何东西,IMO正是您所需要的,但是当到达任何时,您并不想停止……:)< / p>

答案 2 :(得分:0)

仅是我对问题的看法,如您的问题下方我的评论所述:

一种算法,该算法计算每个期间每个订单的固定数量所需的订单数量,从而始终满足需求。
此外,还考虑了每个订单的其余部分(在某个时期内未涵盖),因此最终可以用一个订单少一个订单来满足下一个时期的需求。

def calcOrder(demand, Q):
    result = []
    rest = 0
    for i, e in enumerate(demand):
        current = e - rest
        order = np.ceil(current/Q)
        result.append(int(order))
        rest = order * Q - current
    return result

示例:

import numpy as np
np.random.seed(793)

demand = np.random.randint(0, 51, 5)
Q = 12

demand
# array([50, 20, 19, 48, 25])

print(f'demand\tcurrent\torder\trest')
rest = 0
for i, e in enumerate(demand):
    current = e - rest
    order = int(np.ceil(current/Q))
    rest = order * Q - current
    print(f'{e}\t{current}\t{order}\t{rest}')

# demand  current order   rest
# 50      50      5       10
# 20      10      1       2
# 19      17      2       7
# 48      41      4       7
# 25      18      2       6