野餐用品计数
之前写过一段,字符在字符串中出现次数的代码
import pprint message = 'It was a bright cold day in April, ' \ 'and the clocks were striking thirteen.' count = {} for character in message: count.setdefault(character, 0) count[character] += 1 pprint.pprint(count)
在写野餐用品计数代码时,发现多了个return
由于一直对于返回值的概念不甚了解,又把两段代码拿出来做了对比
并且把野餐用品代码拆分后,每个判断后加上print来查看流程及参数值
发现如果不用return给totalBrought()设一个返回值,
那当apple = totalBrought(allGuests,‘apples’)时,就没有一个值可以返回给apple
由此对return又多了点了解
原代码是没有apple=这一句的,直接用
print("Apples: " + str(totalBrought(allGuests, 'apples')))
来替代了Apples打印行
allGuests = {'Alice': {'apples': 5, 'pretzels': 12}, 'Bob': {"ham sandwiches": 3, 'apples': 2}, 'Carol': {'cups': 3, 'apple pies': 1}} def totalBrought(guests, item): numBrought = 0 for k, v in guests.items(): numBrought = numBrought + v.get(item, 0) return numBrought apple = totalBrought(allGuests, 'apples') print("Number of things being brought:") print("Apples: " + str(apple)) print("Cups: " + str(totalBrought(allGuests, 'cups'))) ...
=================================
物品清单统计:
1. 一开始写,很呆滞,每个物品单独一个打印语句
2. 还把return写倒了total行同缩进,导致返回的数值一直是1,修改后:
inventory = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12} def totalitem(allItems): total = 0 for k, v in allItems.items(): total = allItems.get(k, 0) + total return total items = totalitem(inventory) print('Inventory:' + "\n" + str(inventory['arrow']) + ' arrow' + "\n" + str(inventory['gold coin']) + ' gold coin' + "\n" + str(inventory['rope']) + ' rope' + "\n" + str(inventory['torch']) + ' torch' + "\n" + str(inventory['dagger']) + ' dagger' + "\n" + 'Total number of items: ' + str(items))
3. 参考了提示并整合后,打印加入到循环中
inventory = {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12} def displayInventory(inventory): print('Inventory') total = 0 for k, v in inventory.items(): print(str(v) + ' ' + k) total += v print('Total number of items:' + str(total)) displayInventory(inventory)
============
假设征服一条龙的战利品表示为这样的字符串列表:
dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']
写一个名为 addToInventory(inventory, addedItems)的函数,
其中 inventory 参数是一个字典,表示玩家的物品清单(像前面项目一样),
addedItems 参数是一个列表,就像 dragonLoot。
addToInventory()函数应该返回一个字典,表示更新过的物品清单。
def displayInventory(inventory): print('Inventory') total = 0 for k, v in inventory.items(): print(str(v) + ' ' + k) total += v print('Total number of items:' + str(total)) def addToInventory(inventory, addedItems): for k in addedItems: if k in inventory.keys(): inventory[k] += 1 else: inventory[k] = 1 return inventory inv = {'gold coin': 42, 'rope': 1} dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby'] inv = addToInventory(inv, dragonLoot) displayInventory(inv)
1. 开始想到将列表转换成字典,再将两个字典比较后拼接
2. 若字典中不存在key,则可用dic[key]=value来增加键值对
3. 两个字典相加:相同key,值相加;不同key,值保留
dica = {'a': 1, 'b': 2, 'c': 3, 'f': "hello"} dicb = {'b': 3, 'k': 'world'} dic = {} for key in dica: if dicb.get(key): dic[key] = dica[key] + dicb[key] else: dic[key] = dica[key] for key in dicb: if dica.get(key): pass else: dic[key] = dicb[key] print(dic)
4. 起初代码一直如下,试了很久v+=1,但v的值始终无变化(其实是混淆了v和dic[k]的意义,v并不是dic[k])
重看定义:key()、values()、items()方法返回的值是元组,即不可变(设定如此,其实是搅屎棍,变不变的都无所谓)
因为k,v只是字典在使用方法时返回的值(返回的键值值赋值给了变量k,v),所以即使修改变量v的值,对字典本身的值是不起作用的
5. 所以需要循环累加字典内键的值,必须用dict[k]+=1
dictA = {'a': 1, 'b': 42} listB = ['b', 'c', 'b'] for i in listB: for k, v in dictA.items(): print(i, k, v, dictA[k]) v += 1 # × # dictA[k] += 1 # √