野餐用品计数

之前写过一段,字符在字符串中出现次数的代码

 

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   # √

 

posted on 2021-08-09 00:24  讲道理好嘛  阅读(279)  评论(0编辑  收藏  举报