0
votes

Les dictionnaires ne fonctionnent pas, je reçois également des messages d'erreur 'KeyError: 0' et je ne sais pas ce que cela signifie: / (python au fait)

J'essaie de savoir quel est le meilleur bâtiment à acheter dans Cookie Clicker à tout moment. En ce moment, j'ai des problèmes avec la dernière ligne. 'coût [nombre] = coût de base [nombre] * 1,15 ** (montant gratuit)'. Il dit «KeyError: 0», et je n'ai aucune idée de ce que cela signifie alors pardonnez-moi pour le titre vague. Aussi, si vous pouvez me dire comment l’optimiser, car je doute que copier-coller des dictionnaires soit une bonne façon de procéder.

basecost = {
    
    "cursor" : 15,
    "grandma" : 100,
    "farm" : 1100,
    "mine" : 12000,
    "factory" : 130000,
    "bank" : 1400000,
    "temple" : 20000000,
    "wizardtower" : 330000000,
    "shipment" : 5100000000,
    "alchemylad" : 75000000000,
    "portal" : 1000000000000,
    "timemachine" : 14000000000000,
    "antimattercondenser" : 170000000000000,
    "prism" : 2100000000000000,
    "chancemaker" : 26000000000000000,
    "fractalengine" : 310000000000000000,
    "javascriptconsole" : 71000000000000000000

    }

cost = {

    "cursor" : None,
    "grandma" : None,
    "farm" : None,
    "mine" : None,
    "factory" : None,
    "bank" : None,
    "temple" : None,
    "wizardtower" : None,
    "shipment" : None,
    "alchemylad" : None,
    "portal" : None,
    "timemachine" : None,
    "antimattercondenser" : None,
    "prism" : None,
    "chancemaker" : None,
    "fractalengine" : None,
    "javascriptconsole" : None,
    
    }

basecps = {
    
    "cursor" : 0.1,
    "grandma" : 1,
    "farm" : 8,     
    "mine" : 47,
    "factory" : 260,
    "bank" : 1400,
    "temple" : 7800,
    "wizardtower" : 44000,
    "shipment" : 260000,
    "alchemylad" : 1600000,
    "portal" : 10000000,
    "timemachine" : 65000000,
    "antimattercondenser" : 430000000,
    "prism" : 2900000000,
    "chancemaker" : 21000000000,
    "fractalengine" : 150000000000,
    "javascriptconsole" : 1100000000000,

    }

buildingplural = [
    
    "Cursors",
    "Grandmas",
    "Farms",
    "Mines",
    "Factories",
    "Banks",
    "Temples",
    "Wizard Towers",
    "Shipments",
    "Alchemy Labs",
    "Portals",
    "Time Machines",
    "Antimatter Condensers",
    "Prisms",
    "Chancemakers",
    "Fractal Engines",
    "Javascript Consoles"

    ]


for number, item in enumerate(buildingplural):

    amount = int(input("How many "+ item +" do you have?"))
    free = int(input("How many "+ item +" did you get for free?"))

    cost[number] = basecost[number]*1.15**(amount-free) 


3 commentaires

pourquoi pensez-vous que cost [number] devrait renvoyer quelque chose? Il n'y a aucune clé int dans aucun de vos dictionnaires.


Je me souviens que si vous écrivez «liste [0]», c'est le premier numéro de la liste. Peut-être que je pense à autre chose.


oui ... vous pensez à une liste . Un dictionnaire n'est pas une liste ... Un dictionnaire mappe des clés à des valeurs, vous accédez à une valeur avec une clé correspondante. une liste est une séquence de valeurs, à laquelle vous pouvez accéder par position (c'est-à-dire un index entier)


3 Réponses :


0
votes

Il n'est pas nécessaire d'énumérer la liste ici. Vos clés sont les éléments de la liste.

for item in buildingplural:

    amount = int(input("How many "+ item +" do you have?"))
    free = int(input("How many "+ item +" did you get for free?"))

    cost[item] = basecost[item]*1.15**(amount-free) 


1 commentaires

Les éléments de la liste buildingplural ne sont pas les mêmes éléments dans le dictionnaire, ils sont juste un moyen d'éviter de faire des tas d'instructions if. Je suppose que je pourrais leur faire le même mot.



0
votes

Eh bien, l'erreur est due au fait que vous essayez d'obtenir la valeur de l'élément dict basecost par un nombre et non par sa clé dans la boucle for et ce que vous devez faire est quelque chose comme ceci:

for item in buildingplural:

    amount = int(input("How many "+ item +" do you have?"))
    free = int(input("How many "+ item +" did you get for free?"))
    key_dict = item.lower()[:-1] 
    cost[number] = basecost[key_dict]*1.15**(amount-free)

Comme vous avez pu le voir, vous devez créer un key_dict car les éléments buildingplural sont le pluriel des autres éléments dicts . J'espère que cela peut vous aider :)

Concernant la deuxième question et comment optimiser les créations des dictionnaires, vous ne pouvez pas faire grand-chose car leurs valeurs sont différentes et il n'y a aucune relation entre elles.


0 commentaires

0
votes

cost [nombre] ne fonctionnera pas car le coût est un dictionnaire et non une liste.

Vous devez faire quelque chose comme ci-dessous. Cela va créer un nouveau dict appelé 'newcost' et créer un dictionnaire avec les clés du dictionnaire 'cost' et de nouvelles valeurs dérivées.

newcost = {}
for number, item in enumerate(buildingplural):
    amount = int(input("How many "+ item +" do you have?"))
    free = int(input("How many "+ item +" did you get for free?"))
    newcost.update({(list(cost.keys())[number]): list(basecost.values())[number]*1.15**(amount-free) })


0 commentaires