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