Python更新列表元素一次,直到达到sum(list)

时间:2019-03-03 16:37:22

标签: python

我有一个以全零开头的列表。我想连续向列表中的每个元素添加一个整数,直到整个列表的总和达到某个点。

假设我希望列表总数等于24。这几乎使我在尝试时看起来很有效:

myList = [0,0,0,0,0,0]

while sum(myList) < 24:
    myList =  [x+1 for x in myList]

这使我得到myList = [4,4,4,4,4,4,4],但是如果我希望总数不等于列表中元素的数目,则中断。

我不知道如何将一个添加到第一个元素,然后再添加第二个,依此类推,然后从头开始重新开始,直到达到总和。

所以,我想要

myList = [0,0,0,0,0,0]

while sum(myList) != 22:
    myList =  <method here>

返回

myList = [4,4,4,4,3,3]

感谢您的指导。

2 个答案:

答案 0 :(得分:4)

您需要保留一个索引,当到达末尾时会循环到最前面:

i = 0
while sum(myList) != 22:
    myList[i] += 1
    i = (i + 1) % len(myList)

当您另外增加(i + 1) % len(myList)使其超出范围时,0表达式会将索引循环回i

演示:

>>> myList = [0, 0, 0, 0, 0, 0]
>>> i = 0
>>> while sum(myList) != 22:
...     myList[i] += 1
...     i = (i + 1) % len(myList)
...
>>> myList
[4, 4, 4, 4, 3, 3]

要知道存在could just calculate the values,但一次不会递增一个值,

def distribute(oranges, plates):
    base, extra = divmod(oranges, plates)
    return [base + (i < extra) for i in range(plates)]

您的样本中有6个插槽和22个项目,可以给出:

>>> distribute(22, 6)
[4, 4, 4, 4, 3, 3]

答案 1 :(得分:2)

您甚至不需要循环,您可以直接构建列表:

target = 22
length = 6

quotient, remainder = divmod(target, length)

out = [quotient+1] * remainder + [quotient] * (length-remainder)

print(out, sum(out))
# [4, 4, 4, 4, 3, 3] 22