【问题标题】:python list controlled incrementpython列表控制增量
【发布时间】:2015-09-06 10:48:45
【问题描述】:

我正在尝试增加一个像算盘一样的 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 = 2 list 将增加到 [2,2,1,1] (这也很好)问题是当我从一个不均匀的列表中运行 m()function 时,列表将从 list[0] 增加到最终 [3, 3,1,1] 而不是 [2,2,2,2]。

有没有一种 Pythonic 方法可以让函数从最低值递增列表以实现均匀分布?

【问题讨论】:

  • 你的意思是你想从list.index(min(list)) 开始(仅供参考,list不是一个好的列表名称,因为它会影响内置)?
  • 是的,乔恩——就是这样,我想从最小索引开始——我只使用“列表”名称来让问题更容易阅读——谢谢——有没有从列表的最低索引开始的好方法?
  • 是的,有 - 使用我提供的 sn-p 并找出插入位置。
  • 啊,完美的乔恩——问题得到了完美的回答——知道该把它放在哪里——谢谢。
  • 我是新人 - 如何将其标记为已回答?

标签: python list increment


【解决方案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”再次感谢。
  • 这行很棒:index = (raw_index + starting_index) % len(abacus) -- 非常优雅的声明。太棒了。
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-03
  • 2019-03-18
  • 1970-01-01
  • 2014-04-01
相关资源
最近更新 更多