我有一个以全零开头的列表。我想连续向列表中的每个元素添加一个整数,直到整个列表的总和达到某个点。
假设我希望列表总数等于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]
感谢您的指导。
答案 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