Python列表控制增量

4
我正在尝试像珠算一样递增Python数字列表。
list = [0,0,0,0]
units = 4

def m(list, units):
  for e in range(len(list)):
    if units:
      list[e] = list[e] + 1
      units -= 1

这段代码在执行m(list, units)时能够正常工作,会使列表变成[1,1,1,1]。但问题在于,当units的值为units = 2等时,列表将增加为[2,2,1,1](这也没问题)。但是,当我从一个不均匀的列表中运行m()函数时,列表将从list[0]递增到最终变成[3,3,1,1],而不是[2,2,2,2]。 有没有一种Pythonic的方式可以让函数从最小值开始递增列表以实现平均分布?

2
你的意思是要从 list.index(min(list)) 开始吗?(顺便提一下,list 不是一个好的列表名称,因为它会掩盖内置函数)? - jonrsharpe
是的,确实有 - 使用我提供的片段代码并找出应该将其插入到何处。 - jonrsharpe
我是新手 - 我该如何将此标记为已回答? - Pip S
你不能这样做;那只是一条注释,而不是一个答案。 - jonrsharpe
@Pip S:如果你对你的解决方案有信心,你可以回答自己的问题。提示:你真的不应该使用“list”。用类似“ls”的东西替换它。 - Karpov
显示剩余2条评论
1个回答

1
为了从最小值的第一个元素开始,您可以像@jonrsharpe建议的那样将起始索引设置为starting_index = abacus.index(min(abacus))
但是,您需要避免超出列表的末尾,例如如果units = 4starting_index = 3,因此应该在除以len(abacus)后取计算出的索引的余数,即calculated_index % len(abacus)
最后,我认为只需循环range(units)会更容易。这样您就不需要自己减少单位,并且可以一次处理多个单位,而不是长度等于算盘的长度。
以下是示例实现:
def m(abacus, units):
    starting_index = abacus.index(min(abacus))
    for raw_index in range(units):
        index = (raw_index + starting_index) % len(abacus)
        abacus[index] = abacus[index] + 1

并测试:

abacus = [0,0,0,0]    
print abacus
m(abacus, 2)
print abacus
m(abacus, 4)
print abacus
m(abacus, 3)
print abacus
m(abacus, 3)
print abacus
m(abacus, 7)
print abacus

带有结果:

[0, 0, 0, 0]
[1, 1, 0, 0]
[2, 2, 1, 1]
[3, 2, 2, 2]
[3, 3, 3, 3]
[5, 5, 5, 4]

这个解决方案太美妙了,几乎让我哭了。谢谢!问题已经解决了!我的解决方案是一堆可怕的if else语句来决定索引何时开始,而你的解决方案更加详尽和“pythonic”,再次感谢。 - Pip S
这行代码很棒:index = (raw_index + starting_index) % len(abacus) -- 非常优雅的陈述。太棒了。 - Pip S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接