字典一种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
>>>

多级字典嵌套及操作

...

最新文章

  1. C++STL内存管理方法(g++版)
  2. gulp 压缩js,css
  3. Linux进程控制(二)
  4. 【C#学习笔记】函数调用
  5. DMOZ介绍以及如何提交
  6. 小白日记43:kali渗透测试之Web渗透-SqlMap自动注入(一)-sqlmap参数详解TARGET
  7. lambda -- Java 8 find first element by predicate
  8. 学好UI你必须要掌握这些技术
  9. 学习Redux之分析Redux核心代码分析
  10. Java课设(学生信息管理系统)
  11. MicroPython开发板:TPYBoard v102 播放音乐实例
  12. Centos6.7的在虚拟机virulBox下的lamp平台的搭建
  13. E - Reachability from the Capital
  14. CodeFirst简单演示的步骤
  15. NetSugar.Cap与CAP功能比对
  16. elementUI 学习入门之 checkbox 复选框
  17. redis 常用方法整理
  18. Hystrix入门指南
  19. Codeforces #499 Div2 E (1010C) Border
  20. Exchange邮箱设置,android手机和mac book

热门文章

  1. iOS - UITextView在调用textViewDidChange方法,九宫格相关中文输入的问题
  2. iOS - 扩展UIButton的响应区域
  3. IOS设计模式第六篇之适配器设计模式
  4. Esper学习之七:EPL语法(三)
  5. echarts - 特殊需求实现代码汇总之【饼图】篇
  6. mysql的root的权限被控制无法授权
  7. Linux 安装GCC讲解(在线和无网离线)
  8. Elasticsearch学习之多种查询方式
  9. git查看指令
  10. Excel转Json