递归地对列表值执行一个函数,并将每个结果存储在Python中

递归地对列表值执行一个函数,并将每个结果存储在Python中,python,list,function,recursion,Python,List,Function,Recursion,我有一些难看的代码,可以做我想做的事情,就是在列表中的每个值上预执行一个函数“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.re

我有一些难看的代码,可以做我想做的事情,就是在列表中的每个值上预执行一个函数“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))
fuelist=[]
模块=[14196100756]
def getfuel(lst):
newlist=[x//3-2表示lst中的x]
对于新列表中的x:
如果x<0:
newlist.remove(x)
返回新列表
列表1=获取燃料(模块)
列表2=getfuel(列表1)
列表3=获取燃料(列表2)
列表4=获取燃料(列表3)
列表5=获取燃料(列表4)
列表6=获取燃料(列表5)
list7=getfuel(list6)
list8=getfuel(list7)
list9=getfuel(list8)
列表10=获取燃料(列表9)
总计=列表1+列表2+列表3+列表4+列表5+列表6+列表7+列表8+列表9+列表10
打印(总计)
此列表的输出是/应该是:51314


我记不起最好的办法了。我尝试过使用while循环,但它被某种无限循环所捕获。我也不确定“递归”这个词是否适合我要找的东西,我希望我能更好地解释它。谢谢你的帮助。

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

fuelist=[]
模块=[14196100756]
def getfuel(lst):
newlist=[x//3-2表示lst中的x]
对于新列表中的x:
如果x<0:
newlist.remove(x)
返回新列表
l=[getfuel(模块)]
对于范围(10)内的i:
l、 追加(getfuel(l[i]))
s=0
对于l中的i:
s+=总和(i)
印刷品
删除元素时,它会从列表中删除,但
for循环
会在初始运行时获取其终止值,因此,即使稍后在循环中更改列表内容,它仍会运行到初始设置的位置,因此它最终会显示错误或进入无限循环。

希望它能解决您的问题:)

如果列表为空,您可以使用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

“我尝试过使用while循环,但它被某种无限循环所捕获。”:这更像是一个实际的、实际的问题,但您没有展示该代码。很可能,这就是您希望回答的代码(和问题)。对于改进代码的建议,您可能更擅长于此。此返回值为45647,但原始值的总和为51314。修复了返回结果的错误标识,感谢您的反馈无需先执行
,也无需重复复杂列表理解。只需在lst时循环
,然后重新访问
lst
本身。谢谢。这就是我要找的。我没有在列表理解中看到列表理解,我喜欢它简洁的一面。这不是我真正想要的。我遇到的问题是无法以有效的方式存储getfuel函数的每个结果。我确信我的功能可以改进,但这似乎无助于解决我的问题。@ckrug我已经做了必要的更改。我没有对您的代码做太多更改,并尽量使其简单。如果你有任何困惑,请告诉我。干杯:)