Python递归数据读取

gio*_*lio 5 python recursion minecraft

如果你玩过我的世界,以下将更有意义.由于你们许多人没有,我会尽力解释它

我正在尝试编写一个递归函数,可以找到从Minecraft食谱的平面文件中制作任何minecraft项目的步骤.这个让我很难过.

平面文件有点长,所以我把它包含在这个要点中.

def getRecipeChain(item, quantity=1):
    #magic recursive stuffs go here
Run Code Online (Sandbox Code Playgroud)

所以基本上我需要查找第一个食谱然后查找第一个食谱的所有组分的食谱,依此类推,直到你找到没有食谱的食物.每次我需要将配方附加到列表中,这样我就可以得到一种关于制作物品的顺序的指令集.

所以这是我现在的功能(一个不起作用)

def getRecipeChain(name, quantity=1):
    chain = []

    def getRecipe(name1, quantity1=1):
        if name1 in recipes:
            for item in recipes[name1]["ingredients"]["input"]:
                if item in recipes:
                    getRecipe(item, quantity1)
                else:
                    chain.append(item)

    getRecipe(name, quantity)
    return chain
Run Code Online (Sandbox Code Playgroud)

这是我想要的理想输出.它是一个字典,其中存储了项目名称和数量.

>>> getRecipeChain("solar_panel", 1):
{"insulated_copper_cable":13, "electronic_circuit":2, "re_battery":1, "furnace":1, "machine":1, "generator":1, "solar_panel":1}
Run Code Online (Sandbox Code Playgroud)

所以问题是,我该怎么做?

我知道要求人们为你做的工作在这里不受欢迎,所以如果你觉得这对你来说有点太接近我只是这么说.

Nik*_* B. 3

这可以使用 来优雅地解决collections.Counter,它支持加法:

from collections import Counter

def getRecipe(name, quantity=1):
  if not name in recipes: return Counter({name: quantity})

  subitems = recipes[name]["ingredients"]["input"]
  return sum((getRecipe(item, quantity) for item in subitems), 
             Counter())

print repr(dict(getRecipe("solar_panel")))
# => {'copper': 39, 'refined_iron': 10, 'glass': 3, 
#     'rubber': 78, 'cobblestone': 8, 'tin': 4, 
#     'coal_dust': 3, 'nothing': 10, 'redstone': 6}
Run Code Online (Sandbox Code Playgroud)