Ce que j'essaie de faire, c'est de vérifier si les valeurs de 'dragonLoot' existent dans les clés dictionnaires 'inv'. Si c'est le cas, je veux ajouter 1 à cette valeur, sinon je veux créer une nouvelle clé avec cette valeur et ajouter 1.

Je pense avoir obtenu la partie if, else correcte mais j'ai du mal à le faire boucler et à recevoir une erreur TypeError: list doit être un entier, pas une erreur str . Voici le code:

#Inventory and the Loot value
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

#Function to loop through the items in the list
def displayInventory(inventory):
    print('Inventory:')
    item_total = 0
    for j, k in inventory.items():
        print(str(k) + ' ' + j)
        item_total += k
    print('Total number of items: %s' % str(item_total))

#Where the problem occur
def addToInventory(inventory, addedItems):
    for i in addedItems:
        if addedItems[i] in inventory.keys():
            #Edit: I see an error here now, but I will fix it after I get the loop working
            inventory[addedItems[i]] + 1
        else:
            inventory.setdefault(addedItems[i], 1)

inv = addToInventory(inv, dragonLoot)
displayInventory(inv)

J'ai essayé beaucoup d'autres solutions que j'ai trouvées ici sur StackOverflow mais rien ne fait l'affaire. Est-ce peut-être une autre erreur que j'ai provoquée qui n'a rien à voir avec la boucle elle-même?

Traceback complète:

Traceback (most recent call last):
File "C:/Users/*****/Dropbox/*****", line 19, in   <module>
inv = addToInventory(inv, dragonLoot)
File "C:/Users/*****/Dropbox/*****", line 14, in  addToInventory
if addedItems[i] in inventory.keys():
TypeError: list indices must be integers, not str
0
Salviati 11 juil. 2015 à 10:29

3 réponses

Meilleure réponse

Pourquoi ne pas utiliser un compteur?

#Inventory and the Loot value
inv = {'gold coin': 42, 'rope': 1}
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

import collections
inv = collections.Counter(inv)
inv.update(dragonLoot)

print inv

Produit

Counter({'gold coin': 45, 'rope': 1, 'dagger': 1, 'ruby': 1})

Voir pymotw pour plus d'informations sur les compteurs

2
Pynchia 11 juil. 2015 à 07:49

Je suppose que le problème est ici -

def addToInventory(inventory, addedItems):
    for i in addedItems:
        if addedItems[i] in inventory.keys(): #<--- guessing this is the line.

Le fait est que lorsque vous faites for i in addedItems:, il parcourt les éléments de la liste, pas les index de la liste. donc i serait des éléments comme - 'gold coin', puis 'dagger', etc. Pas les indices de la liste, vous pouvez donc simplement faire la vérification comme - if i in inventory.keys():. Code -

def addToInventory(inventory, addedItems):
    for i in addedItems:
        if i in inventory.keys():
            inventory[i] + 1
        else:
            inventory.setdefault(i, 1)

Pour votre cas, pour compter le nombre d'éléments dans une liste, vous pouvez utiliser - collections.Counter

Exemple -

>>> import collections
>>> dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
>>> invt = dict(collections.Counter(dragonLoot))
>>> invt
{'ruby': 1, 'dagger': 1, 'gold coin': 3}
1
Anand S Kumar 11 juil. 2015 à 07:46

Je suis un peu en retard, je suppose, mais je fais le même tutoriel. La solution que j'ai trouvée est:

def addToInventory(inventory, addedItems): for i in range(len(addedItems)): if addedItems[i] in inventory: inventory[addedItems[i]] += 1 else: inventory.setdefault(addedItems[i],1) return inventory

Au moins, cela fonctionne comme prévu. J'espère que cela aide quelqu'un!

0
Xyberg 1 août 2016 à 18:30