【问题标题】:Recursively preform a function on list values and store each result in Python递归地对列表值执行函数并将每个结果存储在 Python 中
【发布时间】:2020-03-28 04:44:32
【问题描述】:

我有一些丑陋的代码可以做我想做的事情,即对列表中的每个值执行一个函数“x // 3 - 2”,直到该值为 0(并每次存储结果以相加稍后),但我想修改它以提供数百个列表值,而不仅仅是这三个。

fuellist = []
modules = [14, 1969, 100756]
def getfuel(lst):
  newlist = [x // 3 - 2 for x in lst]
  for x in newlist:
    if x < 0:
      newlist.remove(x)
  return newlist


list1 = getfuel(modules)
list2 = getfuel(list1)
list3 = getfuel(list2)
list4 = getfuel(list3)
list5 = getfuel(list4)
list6 = getfuel(list5)
list7 = getfuel(list6)
list8 = getfuel(list7)
list9 = getfuel(list8)
list10 = getfuel(list9)

total = list1 + list2 + list3 + list4 + list5 + list6 + list7 + list8 + list9 + list10
print(sum(total))

输出是/应该是这个列表:51314

我不记得最好的方法了。我试过使用while循环,但它陷入了某种无限循环。我不确定“递归”是否适合我正在寻找的东西,我希望我能更好地解释它。感谢您的帮助。

【问题讨论】:

  • “我尝试过使用 while 循环,但它陷入了某种无限循环。”:所以这更像是一个实际的实际问题,但您没有显示该代码。可能,这就是您想要回答的代码(和问题)。
  • 关于改进代码的建议,你可能会更好codereview.stackexchange.com

标签: python list function recursion


【解决方案1】:

如果列表为空,您可以使用 while 循环,它会被评估为 false,所以

modules = [14, 1969, 100756]
def getfuel(lst):
    result = 0
    while lst:
        lst = [x for x in [x // 3 - 2 for x in lst] if x > 0]
        result+=sum(lst)
    return result

print(getfuel(modules)) # returns the sum

【讨论】:

  • 这会返回 45647,但原来的总和是 51314。
  • 修复了返回结果的错误标识感谢您的反馈
  • 不需要first 和复杂列表理解的重复。只需循环 while lst 并重新设置 lst 本身。
  • 谢谢。这就是我一直在寻找的。我没有在列表推导中看到列表推导,我喜欢它简洁的方面。
【解决方案2】:

在您发表评论后,我已经更新了我的答案。这对你来说很好。这是解决问题的一种非常简单易懂的方法。

fuellist = []
modules = [14, 1969, 100756]
def getfuel(lst):
  newlist = [x // 3 - 2 for x in lst]
  for x in newlist:
    if x < 0:
      newlist.remove(x)
  return newlist

l = [getfuel(modules)]
for i in range(10):
    l.append(getfuel(l[i]))
s = 0
for i in l:
    s += sum(i)
print(s)

当您删除一个元素时,它会从列表中删除,但 for loop 在初始运行时会获取它的终止值,因此即使您稍后在循环中更改列表内容,它仍会运行到您拥有的位置最初设置它,所以它最终会显示错误或进入无限循环。
希望它能解决你的问题:)

【讨论】:

  • 这不是我真正想要的。我遇到的问题是无法以有效的方式存储 getfuel 函数的每个结果。我确信我的功能可以改进,但这似乎对我的问题没有帮助。
  • @ckrug 我已经进行了必要的更改。我没有对您的代码进行太多更改,并试图使其尽可能简单。如果您有任何困惑,请告诉我。干杯:)
猜你喜欢
  • 2014-04-08
  • 1970-01-01
  • 2021-12-04
  • 2020-06-13
  • 2020-02-02
  • 1970-01-01
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多