Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 列表元素的总和,直到极限_Python - Fatal编程技术网

Python 列表元素的总和,直到极限

Python 列表元素的总和,直到极限,python,Python,我面临一个问题,我需要我的代码添加列表的元素,直到总和尽可能接近常量。一旦达到常数,我需要代码来存储总和,以及索引的总和(计算达到该总和需要多少变量)。我是Python的初学者,这个问题很难解决 我试过while循环和for循环。在这一点上,我有点卡住了,不确定我的方法是否准确 下面是一个具体的逻辑示例。假设第1阶段的需求为10,第2阶段的需求为23,Q为12。(此处Q表示最佳数量)。我想弄清楚的是,我们是否应该在第1阶段下订单,包括第1+2阶段的需求,还是最好在第1阶段下一个订单,在第2阶段下

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

我试过while循环和for循环。在这一点上,我有点卡住了,不确定我的方法是否准确

下面是一个具体的逻辑示例。假设第1阶段的需求为10,第2阶段的需求为23,Q为12。(此处Q表示最佳数量)。我想弄清楚的是,我们是否应该在第1阶段下订单,包括第1+2阶段的需求,还是最好在第1阶段下一个订单,在第2阶段下另一个订单。Q是决定它的因素,如果周期1的需求更接近Q,或者周期1+2的累积需求更接近Q。在本例中,| 10-12 |<|(10+23)-12 |,因此我们要记录周期1的订单,以及周期2的另一个订单

def feeoq(q,需求):
总和=0
产品=[]
对于我的需求:
sum=sum+i
如果abs(sum-q)

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

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

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

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
,函数返回
sum
sum-e

现在,我在代码中使用yield时使用了return这个动词:它不是一个常见的函数,而是一个函数。这类函数的主要线索是,当它们产生一个值时,你可以像返回一个值一样考虑第一步,但有一个重要的区别:函数本身不返回(即不结束),而是进入休眠状态,等待下一次调用,保持其完整状态,包括到目前为止计算的所有值,然后在yield之后的下一行继续,就好像之前什么都没发生一样-直到下一个yield关键字


简言之:如果你想总结到什么时候,但又不想在达到什么时候停下来,我想这正是你所需要的…:)

这正是我对这个问题的观点,正如我在你的问题下面的评论中所述:

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


例如:


非常感谢。我的目标是继续为列表的其余部分添加元素。你认为我还能做什么呢?当你返回一些值时,函数就会停止。也许你应该把值打印出来。或者,如果需要存储该值,请将该值指定给全局变量。您可以在这里阅读有关全局变量的信息@Lelionjaune为什么你的目标是继续添加列表的其余部分?你一开始就说过,任务是求和,直到和尽可能接近某个常数。很抱歉,如果我没有正确解释我的问题,我会尽量使它更一般化。所以我要做的就是把列表中的前几个值求和,直到它接近我的常数,然后继续,直到列表的末尾。因为这是一个生产调度问题,我想知道生产什么数量,它将持续多长时间,以及整个预测期,这与我的列表的大小有关。这更有意义吗?对不起,至少对我来说不是-但是,我不是生产计划员,所以。。。无论如何,在这种情况下,直到是什么意思。我的意思是,当你像以前一样继续做同样的事情时,就没有时间了。或者您想将整个列表分成子列表,这样所有这些子列表的总和都等于(或多或少)常量值q?换句话说,直到你的 Suths/Cuff>被重新设置为0并且新的子列表开始……考虑发布一个具体的例子,也就是所谓的。基本上,不仅仅是提到你的代码没有达到你的预期,而是通过一个具体的列表,一个具体的常数和你的预期输出来展示你的预期。我现在正在重写我的代码,以更好地说明我的问题。谢谢你的建议好吧,也许你也可以检查一下我在回答中的方法是否正确。我印象深刻,你的方法很有效,并且完全符合我(糟糕)试图描述的。我没有考虑使用子列表以及枚举。我非常感谢你的帮助。这个算法背后的数学很容易理解和建模,但我真的很难将其翻译成Python代码,你能就如何提高我在这方面的技能提出具体建议吗?再次感谢!阅读了下面评论中的示例(顺便说一句,您的帖子中仍然缺少此示例):)我仍然不太理解您的问题/尝试解决问题的方法:假设Q为12,就像您的示例中一样-如果需求列表以
[50,20,…]
开头会怎么样?一个合适的算法不应该计算出,在第一个周期中,你需要5*Q=60来覆盖前50个周期吗?然后是犯人
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