字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。

定义字典(dictionary)

info = {
'stu1101': "Amy",
'stu1102': "Bob",
'stu1103': "Cindy"
}

字典的特性:

  • dict是无序的
  • key必须是唯一的,so 天生去重
  • 查询速度快,比列表快多了
  • 比list占用内存多

为什么会查询速度会快呢?因为他是hash类型的,那什么是hash呢?

哈希算法将任意长度的二进制值映射为较短的固定长度的二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法

dict会把所有的key变成hash 表,然后将这个表进行排序,这样,你通过data[key]去查data字典中一个key的时候,python会先把这个key hash成一个数字,然后拿这个数字到hash表中看没有这个数字, 如果有,拿到这个key在hash表中的索引,拿到这个索引去与此key对应的value的内存地址那取值就可以了。

增加

>>> info["stu1104"]="David" #增加
>>> info
{'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'}

删除

>>> info
{'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'}
>>> info.pop("stu1101") #标准删除
'Amy'
>>> info
{'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1104': 'David'}
>>> del info["stu1103"] #换个姿势删除,del是Python自带的,想删谁就删谁
>>> info
{'stu1102': 'Bob', 'stu1104': 'David'}
>>> info.popitem() #随机删除
('stu1104', 'David')
>>> info
{'stu1102': 'Bob'}

查找

>>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"}
>>> "stu1102" in info #标准用法,判断一个key是否在字典中存在
True
>>> info.get("stu1102") #获取
'Bob'
>>> info["stu1102"] #同上,但是看下面
'Bob'
>>> info.get("stu1105") #key不存在返回None
>>> print(info.get("stu1105"))
None
>>> info["stu1105"] #key不存在就报错,慎用
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'stu1105'

修改

>>> info
{'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy'}
>>> info["stu1101"]="Alex" #修改
>>> info
{'stu1101': 'Alex', 'stu1102': 'Bob', 'stu1103': 'Cindy'}

其他

>>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"}
>>> info.values() #输出字典中所有的value
dict_values(['Amy', 'Bob', 'Cindy'])
>>> info.keys() #输出字典中所有的key
dict_keys(['stu1101', 'stu1102', 'stu1103'])
>>> info.setdefault("stu1106","xiaoming") #查找字典中是否有stu1106,若没有则创建并为其赋值为xiaoming
'xiaoming'
>>> info
{'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming'}
>>> info.setdefault("stu1101","Alex") #查找字典中是否有stu1101,若有,返回其值,且不修改
'Amy'
>>> info
{'stu1101': 'Amy', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming'}
>>> b={1:2,3:4,'stu1101':'Alex'}
>>> info.update(b) #两个字典表合并,若key有交叉则覆盖其值
>>> info
{'stu1101': 'Alex', 'stu1102': 'Bob', 'stu1103': 'Cindy', 'stu1106': 'xiaoming',1: 2, 3: 4}
>>> info.items() #字典转成列表
dict_items([('stu1101', 'Alex'), ('stu1102', 'Bob'), ('stu1103', 'Cindy'), ('stu1106', 'xiaoming'), (1, 2), (3, 4)])
>>> dict.fromkeys([1,2,3],'test') #通过一个列表生成默认dict,最好少用,因为有个不好解释的坑,如下
{1: 'test', 2: 'test', 3: 'test'}
>>>
>>> c=dict.fromkeys([1,2,3],'test')
>>> c
{1: 'test', 2: 'test', 3: 'test'}
>>> c[1]="aaa" #无嵌套时,只修改1对应的value
>>> c
{1: 'aaa', 2: 'test', 3: 'test'}
>>> c=dict.fromkeys([6,7,8],["aa",{"name":"Alex"},"bb"])
>>> c
{6: ['aa', {'name': 'Alex'}, 'bb'], 7: ['aa', {'name': 'Alex'}, 'bb'], 8: ['aa', {'name': 'Alex'}, 'bb']}
>>> c[7][1]["name"]="jack" #多层嵌套时,所有的key对应的value都修改,类似于列表的copy方法
>>> c
{6: ['aa', {'name': 'jack'}, 'bb'], 7: ['aa', {'name': 'jack'}, 'bb'], 8: ['aa', {'name': 'jack'}, 'bb']}

循环dict

>>> info = {'stu1101': "Amy",'stu1102': "Bob",'stu1103': "Cindy"}
>>> for key in info:
... print(key,info[key]) #方法1,高效,建议使用
...
stu1101 Amy
stu1102 Bob
stu1103 Cindy
>>> for k,v in info.items():
... print(k,v) #方法2,会先把dict转成list,数据里大时莫用
...
stu1101 Amy
stu1102 Bob
stu1103 Cindy
>>>

多级字典嵌套及操作

...

Python3学习之路~2.4 字典操作的更多相关文章

  1. Python3学习之路~2.7 文件操作

    对文件操作流程 打开文件,得到文件句柄并赋值给一个变量 通过句柄对文件进行操作 关闭文件 现有文件如下 Somehow, it seems the love I knew was always the ...

  2. Python3学习之路~2.6 集合操作

    集合是一个无序的,不重复的数据组合,它的主要作用如下: 去重,把一个列表变成集合,就自动去重了 关系测试,测试两组数据之前的交集.差集.并集等关系 常用操作 >>> list1 = ...

  3. Python3学习之路~2.3 字符串操作

    字符串操作 特性:不可修改 name="my \tname is alex" print(name.capitalize()) #首字母变大写 print('Alex LI'.ca ...

  4. Python3学习之路~2.8 文件操作实现简单的shell sed替换功能

    程序:实现简单的shell sed替换功能 #实现简单的shell sed替换功能,保存为file_sed.py #打开命令行输入python file_sed.py 我 Alex,回车后会把文件中的 ...

  5. Python3学习之路~0 目录

    目录 Python3学习之路~2.1 列表.元组操作 Python3学习之路~2.2 简单的购物车程序 Python3学习之路~2.3 字符串操作 Python3学习之路~2.4 字典操作 Pytho ...

  6. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Python3学习之路~2.1 列表、元组操作

    列表 列表是我们以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作. 定义列表(list) names=['Amy','Bob','Cindy','David'] 通过下标访问列 ...

  8. Python3学习之路~5.7 Json & pickle 模块

    用于序列化的两个模块 json,用于字符串 和 python数据类型间进行转换 pickle,用于python特有的类型 和 python的数据类型间进行转换 Json模块提供了四个功能:dumps. ...

  9. Python3学习之路~9.4 队列、生产者消费者模型

    一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很大的区别 ...

随机推荐

  1. 如何在taro的map循环中使用if条件渲染

    在taro的jsx中,鉴于编译的机制,官方明确的表示了不能在map循环中使用if循环, 但是呢,官方也给出了解决办法,那就是提取变量或者是用三目运算嵌套的方法: 链接奉上:https://github ...

  2. 如何将一个项目打成war包?

    如何将一个项目打成war包?进入该项目所在目录jar  -cvf  myProjec.war  myProject

  3. thinkphp 控制器unset删除对象变量失败。。

    今儿开发过程中发现 tp是unset 变量失败..具体代码 foreach( $this->menu as $k => $v){ if(0 == $v['flag']) unset($th ...

  4. MegaCli 使用

    安装: wget ftp://rpmfind.net/linux/Mandriva/devel/cooker/x86_64/media/non-free/release/megacli-8.02.21 ...

  5. 【Spring源码分析系列】加载Bean

    /** * Create a new XmlBeanFactory with the given input stream, * which must be parsable using DOM. * ...

  6. 【大数据系列】hadoop集群设置官方文档翻译

    Hadoop Cluster Setup Purpose Prerequisites Installation Configuring Hadoop in Non-Secure Mode Config ...

  7. OAuth网络协议(转)

    一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户为了使用该服务,必须让"云冲 ...

  8. python中字符串(str)的常用处理方法

    str='python String function' 生成字符串变量str='python String function' 字符串长度获取:len(str)例:print '%s length= ...

  9. 问题记录 为ubuntu16.04添加windows字体(解决JIRA图表乱码的问题)

    最近遇到了JIRA在新的ubuntu机器上图表的中文无法正确显示的问题,解决的方法是,为ubuntu安装中文字体,我们选择把windows上的字体复制到ubuntu上来安装的方法,步骤如下: 从win ...

  10. AD添加LOGO的方法

    1 将logo图片转换成单色的BMP 图像.简单的方法是使用Windows自带的画图程序,在将图片另存为时, 在文件类型下拉列表中选择单色.bmp即可.我们以Altium为例,如图所示将蓝色logo另 ...