I’d like to be able to create a function / algorithm to retrieve a craft tree via recipe data in json it’s a fairly complex algorithm I can’t do it alone I’ve been working on this function for 12 hours here’s what I’d like the function to return to me if i past “Cyclone” element:
the recettes_data.json looks like this:
{
"craftingtree": {
"Cyclone": {
"craftingtree1": {
"recipe1": {
"text": "Swamp",
"emoji": "????",
"discovered": false,
"Swamp": {
"recipe1": {
"text": "Water",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Plant",
"emoji": "????",
"discovered": false,
"Plant":{
"recipe1": {
"text": "Water",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Earth",
"emoji": "????",
"discovered": false
}
}
}
}
},
"recipe2": {
"text": "Tornado",
"emoji": "????️",
"discovered": false,
"Tornado":{
"recipe1": {
"text": "Wind",
"emoji": "????️",
"discovered": false
},
"recipe2": {
"text": "Storm",
"emoji": "⛈️",
"discovered": false,
"Storm":{
"recipe1": {
"text": "Wind",
"emoji": "????️",
"discovered": false
},
"recipe2": {
"text": "Wave",
"emoji": "????",
"discovered": false,
"Wave":{
"recipe1": {
"text": "Water",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Wind",
"emoji": "????️",
"discovered": false
}
}
}
}
}
}
}
}
}
}
}
{
"recettes": {
"Steam": [
{
"recipe1": {
"text": "Water",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Fire",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Fire",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Wave",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Water",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Engine",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Fire",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Engine",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Smoke",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Engine",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Fog",
"emoji": "????️",
"discovered": false
},
"recipe2": {
"text": "Engine",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Engine",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Volcano",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Engine",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Ash",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Engine",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Incense",
"emoji": "????️",
"discovered": false
}
},
{
"recipe1": {
"text": "Water",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Geysir",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Water",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Steampunk",
"emoji": "????️",
"discovered": false
}
},
{
"recipe1": {
"text": "Fire",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Ocean",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Fire",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Puddle",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Fire",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Steampunk",
"emoji": "????️",
"discovered": false
}
},
{
"recipe1": {
"text": "Wave",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Steampunk",
"emoji": "????️",
"discovered": false
}
},
{
"recipe1": {
"text": "Smoke",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Train",
"emoji": "????",
"discovered": false
}
},
{
"recipe1": {
"text": "Smoke",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Steampunk",
"emoji": "????️",
"discovered": false
}
},
{
"recipe1": {
"text": "Lava",
"emoji": "????",
"discovered": false
},
"recipe2": {
"text": "Steampunk",
"emoji": "????️",
"discovered": false
}
}
]}
I’m not going to display all the elements in this data because it’s much too long. Just think that after Steam there’s a new element with other recipes.
I’d like the craft tree to stop at the primary element (Fire , Water, Wind, Earth)
I’ve tried this, but it gives me completely empty values that aren’t organized the way I want them to be.
import json
def build_crafting_tree_for_element(element, recipes):
crafting_tree = {}
for i, recipe in enumerate(recipes, start=1):
recipe_key = f"craftingtree{i}"
crafting_tree[recipe_key] = {}
for key, value in recipe.items():
if value["text"] == element:
crafting_tree[recipe_key][key] = value
sub_recipes = value.get(element, [])
if sub_recipes:
crafting_tree[recipe_key][key][element] = build_crafting_tree_for_element(element, sub_recipes)
return crafting_tree
def transform_recipes_to_crafting_tree_for_element(element, data):
crafting_tree = {}
for key, value in data["recettes"].items():
crafting_tree[key] = build_crafting_tree_for_element(element, value)
return {"craftingtree": crafting_tree}
# Exemple d'utilisation
with open('./recettes_data.json', encoding="utf-8") as f:
data = json.load(f)
element = "Cyclone"
crafting_tree = transform_recipes_to_crafting_tree_for_element(element, data)
print(json.dumps(crafting_tree, indent=4))
Yorick x is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.