Display resources for each factory in the Rocket Valley Tycoon
I would turn this into one class that takes a list of ingredients and cost tuples. The resulting object can be added with another of its instance or multiplied with a number.

from collections import defaultdict

class Ingredient:

    def __init__(self, *ingredients):
        self.d = defaultdict(int)
        if len(ingredients) == 1 and isinstance(ingredients[0], str):
            # special case for base ingredients
            self.d[ingredients[0]] = 1
        else:
            for ingredient, amount in ingredients:
                self.d[ingredient] += amount

    @property
    def ingredients(self):
        return list(self.d.keys())

    @property
    def amounts(self):
        return list(self.d.values())

    def __rmul__(self, other):
         # allows doing other * self, where other is a number
        return Ingredient(*zip(self.ingredients, [other * x for x in self.amounts]))

    def __add__(self, other):
        # allows self + other, where other is another Ingredient
        return Ingredient(*zip(self.ingredients + other.ingredients,
                               self.amounts + other.amounts))

    def __str__(self):
        return str(list(self.d.items()))


Then you can define the base items and any derived item is just algebraic manipulations:

coal = Ingredient("Coal")
water = Ingredient("Water")
copper_ore = Ingredient("Copper Ore")
carbon = 2 * water + 4 * coal
copper_plates = 20 * copper_ore + 10 * carbon
print(copper_plates)
# [('Copper Ore', 20), ('Water', 20), ('Coal', 40)]