字典:求和计数(return知识巩固)
野餐用品计数
之前写过一段,字符在字符串中出现次数的代码
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 # √
字典:求和计数(return知识巩固)的更多相关文章
- python 用字典进行计数的三种常用方法
1.常规方法 初始化一个字典,遍历列表或字符串,如果遍历的值已经存在于字典中,则字典值直接加1,否则,令字典键为当前遍历的值,字典值为1, 代码如下: >>> dic = {} &g ...
- Python中字符串、列表、元组、集合、字典中的一些知识,有些不太常见
————————笔记——————————# 字符串1. 字符串是不可变的.2. 字符串切片输出:`[start:end:step]`.使用`a[::-1]`倒序输出字符串.3. `str.split( ...
- python 创建字典以及操作字典----这是基础知识
当你编程久了,发现所有的东西都是建立在基础之上的,庞大的代码 你要识别出它的类型是什么 或者返回后类型是什么!? 根据返回的类型 或者需要操作的对象是什么类型 就可以选择相应的方法进行处理 #创建字 ...
- Andorid Binder进程间通信---Binder本地对象,实体对象,引用对象,代理对象的引用计数
本文參考<Android系统源码情景分析>,作者罗升阳. 一.Binder库(libbinder)代码: ~/Android/frameworks/base/libs/binder --- ...
- hdu 2846 字典树变形
mark: 题目有字串匹配的过程 有两点 1.为了高效的匹配子串 可以把所有的子串都预处理进去 然后字典树计数就放在最后面 2.在同一个母串处理自串的时候 会有重复的时候 比如abab 这里去重用个 ...
- python学习-day12:列表、元祖、字典介绍和内置
list:列表 >>>----可以被修改.修改成元素,元素可以使单独的数字,也可以是:新的list. 通过:链表..每个元素存储的时候,同时会指向下一个元素. 二.list编辑修改方 ...
- JavaEE系列之(一)JSP基础知识详解
一.JSP基础语法 1.JSP简介 JSP(Java Server Pages),其根本是一个简化的Servlet设计,它实现了在Java中使用HTML标签.JSP是一种动态网页 ...
- redis 字典
redis 字典 前言 借鉴了 黄健宏 的 <<Redis 设计与实现>> 一书, 对 redis 源码进行学习 欢迎大家给予意见, 互相沟通学习 概述 字典是一种用于存储键值 ...
- (转)C++——std::string类的引用计数
1.概念 Scott Meyers在<More Effective C++>中举了个例子,不知你是否还记得?在你还在上学的时候,你的父母要你不要看电视,而去复习功课,于是你把自己关在房间里 ...
- 利用Runtime实现简单的字典转模型
前言 我们都知道,开发中会有这么一个过程,就是将服务器返回的数据转换成我们自己定义的模型对象.当然服务器返回的数据结构有xml类型的,也有json类型的.本文只讨论json格式的. 大家在项目中一般是 ...
随机推荐
- scrapy框架学习(六)日志设置和数据存储
日志设置 CRITICAL : 严重错误 ERROR : 一般错误 WARNING : 警告 INFO : 一般的信息 DEBUG : 调试信息 默认的显示级别是DEBUG # 设置错误显示级别 LO ...
- pgsql的round函数
不知道是我菜还是咋地,感觉pg里面用round不是很爽啊,明明在其他库能运行的,字段类型卡得太死了吧 照说float8类型还是数值,怎么就报错呢,如下 错误: 函数 round(double pre ...
- 简单友好的 Python 任务调度库
schedule :https://github.com/dbader/schedule 该项目人性化的 API 设计,让开发者仅用几行代码就能轻松实现定时任务.它不依赖任何第三方库,全部代码也就一个 ...
- Jmeter(三十九) - 从入门到精通进阶篇 - Jmeter配置文件的刨根问底 - 上篇(详解教程)
------------------------------------------------------------------- 转载自:北京-宏哥 https://www.cnblogs.co ...
- 此平台不支持虚拟化的 Intel VT-x/EPT。不使用虚拟化的 Intel VT-x/EPT,是否继续?
1.cpu虚拟化是否打开 2.Windows安全中心>设备安全性>内核隔离
- SQLSERVER 存储过程里 执行sql字符串 并返回结果
-- Author: <Author,,Name>-- Create date: <Create Date,,>-- Description: 停用/启用12个月销售目标--e ...
- 1326. 灌溉花园的最少水龙头数目 (Hard)
问题描述 1326. 灌溉花园的最少水龙头数目 (Hard) 在 x 轴上有一个一维的花园.花园长度为 n,从点 0 开始,到点 n 结束. 花园里总共有 n + 1 个水龙头,分别位于 [0, 1, ...
- java中的批量导入,批量更新数据
批量插入 数据,提高效率 Dao层 int insertBatch(List<HealthImport> list); xml文件 <insert id="insertBa ...
- etcd 基于ubuntu 20.04 部署集群
Etcd是Kubernetes集群中的一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息,K8S中所有持久化的状态信息都是以Key-Value的形式存储在etcd中,提供分布式协调服务.之 ...
- C#中Newtonsoft.Json.dll 的使用
1.类库说明Newtonsoft.Json.dll是.NET 下开源的json格式序列号和反序列化的类库,利用此类库,可以方便地操作json数据,其中在反序列化时,可以直接将格式化的json数据处理成 ...