Python 中的字典提供了一种灵活的访问和组织数据的方式

  • 字典是由很多值组成的集合

  • 字典的索引可以是不同的数据类型,同样也不止是整数,也有字符串

  • 字典的索引被称为“键”,键及键所关联的值叫键值对(类似于Java中的Map集合)

  • 字典是另一种可变容器模型,且可存储任意类型对象。

  • 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示:

dictionary  = {'url1':'baidu', 'url':'google', 'num1':12, 'num2':34};

键一般是唯一的,如果键重复,最后的一个键值对会替换前面的键值对,值没有唯一性要求,如下:

dic1 = {'name':'zhangsan','age':23,'address':'BeiJing','name':'lisi'}# 查看字典值发现重复的键值后面的替换前面的dic1{'name': 'lisi', 'age': 23, 'address': 'BeiJing'}dic1['name']'lisi'

值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组,如下:

dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258',('a','b'):(12,43)}

1. 访问字典数据

创建一个字典,并访问数据字典内容,以下字典的键是‘size’,'color','character',这些键对应的值是‘big’,'white','gentle',访问字典的值通过方括号里面添加键就可以直接进行访问,例如:

MyDog = {'size':'big','color':'white','character':'gentle'}# 字典值通过[‘键’]来访问print(MyDog['size']) big   #输出结果print('My Dog has '+MyDog['color']+' fur.' + ' and it has a ' + MyDog['character']+' character')My Dog has white fur. and it has a gentle character #输出结果

同样的,字典也可以用整数作为键,和列表的索引类似,只是字典的值是任何整数类型都行,不必要从0开始,因为键值的数据类型是任意的,如下:

MyCon = {12:'big',0:'white',354:'gentle',1:'good'}# 访问键为 12 的字典值MyCon[12]'big'# 访问键为 0 的字典值MyCon[0]'white'

因为字典是不排序的,所以不能像列表那样切片。如果访问字典中不存在的键,将导致 KeyError 出错信息。这很像列表的“越界” IndexError 出错信息。在交互式环境中输入以下代码,并注意显示的出错信息,因 为没有'color'键:

dic1 = {'name':'zhangsan','age':23,'address':'BeiJing'}#找字典中键为 'color' 的值dic1['color']Traceback (most recent call last):  File "", line 1, in KeyError: 'color'

2、修改字典元素

2.1 添加和更新字典数据

向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:

dict = {'Name': 'Fiona', 'Age': 10, 'Class': 'Three'}# 更新dict['Age'] = 8 # 添加dict['School'] = "Middle School" # 查看字典数据 dict{'Name': 'Fiona', 'Age': 8, 'Class': 'Three', 'School': 'Middle School'}

2.2 删除字典元素

对字典元素的删除操作能单一删除也能将整个字典清空,显示的删除一个字典使用 del 命令“

dict = {'Name': 'Fiona', 'Age': 10, 'Class': 'Three'}# 删除键是'Name'的条目 del dict['Name']  # 清空字典所有条目dict.clear()  # 删除整个字典元素del dict           print ("dict['Age']: ", dict['Age'])print ("dict['School']: ", dict['School'])

以上打印语句这会引发一个异常,因为用 del 后的字典不再存在:

Traceback (most recent call last):  File "test.py", line 12, in     print("dict['Age']: ", dict['Age'])TypeError: 'type' object is not subscriptable

3、字典键的特性

字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。

两个重要的点需要记住:

1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,如下实例:

实例

dict = {'Name': 'Fiona', 'Age': 10, 'Name': 'Manni'}  print "dict['Name']: ", dict['Name']# 以上实例输出结果:dict['Name']:  Manni

2)键必须不可变,所以可以用数字,字符串或元组充当,所以用列表就不行,如下实例:

dict = {['Name']: 'Fiona', 'Age': 10}  print "dict['Name']: ", dict['Name']# 以上实例输出结果:Traceback (most recent call last):  File "test.py", line 3, in     dict = {['Name']: 'Zara', 'Age': 7} TypeError: list objects are unhashable

4、字典的函数

4.1 len()

len() 方法计算字典元素个数(键的总个数)

>>> dict = {'Name': 'Fiona', 'Age': 10, 'class': 'Three'}  >>> len(dict)     3

4.2 str()

str() 方法输出字典中可以打印的字符串标识

>>> dict = {'Name': 'Runoob', 'Age': 10, 'Class': 'Three'}>>> str(dict)"{'Name': 'Runoob', 'Age': 10, 'Class': 'Three'}"

4.3 type()

type() 方法返回输入的变量类型,如果变量是字典就返回字典类型

>>> dict = {'Name': 'Runoob', 'Age': 10, 'Class': 'Three'}>>> type(dict)

5、字典的方法

5.1 dict.clear()

删除字典内所有元素,clear() 方法没有任何返回值,实例如下:

dict = {'Name': 'Fiona', 'Age': 10}print ("字典长度 : %d" %  len(dict))dict.clear()print ("字典删除后长度 : %d" %  len(dict))# 输出结果为:字典长度 : 2字典删除后长度 : 0

5.2 dict.copy()

copy() 方法对字典进行复制

dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}dict11 = dict.copy()print(dict11)print("新复制的字典为 : ", dict11)dict1 = {'user': 'runoob', 'num': [1, 2, 3]}# 浅拷贝: 引用对象  赋值dict2 = dict1  # 拷贝dict3 = dict1.copy()  # 修改 data 数据dict1['user'] = 'root'dict1['num'].remove(1)# 输出结果print(dict1)print(dict2)print(dict3)

实例中 dict2 其实是 dict1 的引用,即别名,所以输出结果都是一致的,dict3 对父对象进行了深拷贝,深拷贝不会随dict1 修改而修改,子对象是浅拷贝所以随 dict1 的修改而修改,即赋值会随父对象的修改而修改,拷贝不会随父对象的修改而修改,以上结果输出如下:

{'Name': 'Runoob', 'Age': 7, 'Class': 'First'}新复制的字典为 :  {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}{'user': 'root', 'num': [2, 3]}{'user': 'root', 'num': [2, 3]}{'user': 'runoob', 'num': [2, 3]}

5.3 dict.fromkeys()

创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值,该方法返回一个新的字典

fromkeys() 方法语法

dict.fromkeys(seq[, value])# 参数seq -- 字典键值列表。value -- 可选参数, 设置键序列(seq)对应的值,默认为 None。

实例:

# dict.fromkeys(seq[, value])seq = ('name', 'age', 'class')# 不指定值dict = dict.fromkeys(seq)print("新的字典为 : %s" % str(dict))# 赋值 10dict = dict.fromkeys(seq, 10)print("新的字典为 : %s" % str(dict))# 赋值一个元组dict = dict.fromkeys(seq,('zs',8,'Two'))print("新的字典为 : %s" % str(dict))

执行结果返回一个新的字典,如果不指定值默认为None,以上结果输出结果为:

新的字典为 : {'name': None, 'age': None, 'class': None}新的字典为 : {'name': 10, 'age': 10, 'class': 10}新的字典为 : {'name': ('zs', 8, 'Two'), 'age': ('zs', 8, 'Two'), 'class': ('zs', 8, 'Two')}

5.4 dict.get()

返回指定键的值,如果值不在字典中返回default值

get() 方法语法

dict.get(key, default=None)# 参数key -- 字典中要查找的键。default -- 如果指定键的值不存在时,返回该默认值值。

实例:

# get ()方法的应用举例dict = {'Name': 'Mary', 'Age': 20}print ("Age 值为 : %s" %  dict.get('Age'))print ("Name 值为 : %s" %  dict.get('Name'))print ("Sex 值为 : %s" %  dict.get('Sex', "NA"))

以上结果输出为:

Age 值为 : 20Name 值为 : MarySex 值为 : NA

5.5 key in dict

如果键在字典dict里返回true,否则返回false

dict = {'Name': 'Mary', 'Age': 20,'Address':'BeiJing'}# 检测键 Age 是否存在if 'Age' in dict:    print("键 Age 存在")else:    print("键 Age 不存在")# 检测键 Sex 是否存在if 'Sex' in dict:    print("键 Sex 存在")else:    print("键 Sex 不存在")# not in# 检测键 Name 是否存在if 'Name' not in dict:    print("键 Name 不存在")else:    print("键 Name 存在")

以上结果输出为:

键 Age 存在键 Sex 不存在键 Name 存在

5.6 dict.items()

item() 方法以列表返回可遍历的(键, 值) 元组数组

dict = {'Name': 'Mary', 'Age': 17} print ("Value : %s" %  dict.items())# 输出结果为:Value : dict_items([('Age', 17), ('Name', 'Mary')])

可遍历的元组数组举例:

dict1 = {'老大':'25岁',        '老二':'20岁',        '老三':'12岁',        }print(dict1.items())for key,values in dict1.items():    print(key + '已经' + values + '了')

以上结果输出为:

老大已经25岁了老二已经20岁了老三已经12岁了Process finished with exit code 0

5.7 dict..keys()

返回一个迭代器,可以使用 list() 来转换为列表

keys()方法语法:

dict.keys()

实例:

dict = {'Name': 'Mary', 'Age': 17}print(dict.keys())

以上结果输出为:

dict_keys(['Name', 'Age'])

由结果看出结果返回一个迭代对象,这时候我们可以使用 list 转换为列表:

list1 = list(dict.keys())print ("转换后的结果为 : %s" % list1)# 输出结果为一个列表,后续可以对其进行相应操作:转换后的结果为 : ['Name', 'Age']

5.8 dict..setdefault()

Python 字典 setdefault() 方法和 get() 方法类似, 如果 key 在 字典中,返回对应的值。如果不在字典中,则插入 key 及设置的默认值 default,并返回 default ,default 默认值为 None。

setdefault()方法语法:

dict.setdefault(key, default=None)# 参数key -- 查找的键值。default -- 键不存在时,设置的默认键值。

实例:

dict = {'Name': 'Mary', 'Age': 17} print ("Age 键的值为 : %s" %  dict.setdefault('Age', None))print ("Sex 键的值为 : %s" %  dict.setdefault('Sex', None))print ("新字典为:", dict)

以上结果输出为:

Age 键的值为 : 17Sex 键的值为 : None新字典为:{'Age': 17, 'Name': 'Mary', 'Sex': None}

5.9 dict..update(dict2)

Python 字典 update() 函数把字典参数 dict2 的 key/value(键/值) 对更新到字典 dict 里。

语法:

dict.update(dict2)# 参数 dict2 -- 添加到指定字典dict里的字典。

实例:

dict = {'Name': 'Mary', 'Age': 17}dict2 = {'Sex': 'female' }# 将 dict2 中的结果添加到字典 dict 中 dict.update(dict2)print ("更新字典 dict : ", dict)

以上结果输出为:

更新字典 dict :  {'Name': 'Mary', 'Age': 17, 'Sex': 'female'}

5.10 dict.values()

Python 字典 values() 方法返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值。

dict = { 'Name': 'Mary','Sex': 'male', 'Age': 7}print("字典所有值为 : ", list(dict.values()))

以上结果输出为:

字典所有值为 :  ['Mary', 'male', 7]

5.11 dict.pop(key[,default])

Python 字典 pop() 方法删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。否则,返回default值。

pop()方法语法:

pop(key[,default])#参数key: 要删除的键值default: 如果没有 key,返回 default 值# 返回值返回被删除的值。

实例:

dict = {'Name': 'Mary', 'Age': 17}result = dict.pop('Age') # 删除print(result)

以上结果输出为:

17Process finished with exit code 0

5.12 dict.popitem()

Python 字典 popitem() 方法随机返回一个键值对(key,value)形式,按照 LIFO(Last In First Out 后进先出法) 顺序规则,即最末尾的键值对。如果字典已经为空,却调用了此方法,就报出KeyError异常。

实例:

dict = {'Name': 'Mary', 'Age': 17}pop_obj=dict.popitem()print(pop_obj)print(dict)

以上结果输出为:

('Age', 17){'Name': 'Mary'}

将字典清空:

dict = {'Name': 'Mary', 'Age': 17}del dictprint(dict.popitem())

结果输出为:

Traceback (most recent call last):  File "test.py", line 4, in     print(dict.popitem())TypeError: descriptor 'popitem' of 'dict' object needs an argument

6、字典和列表

6.1 字典和列表差异

列表中的元素表项由于元素通过序列从 0 开始递增存放,所以列表中的表项是排序的,而字典的内容的表项是不排序的,如下例子就很好的说明列表和字典的区别:

list1 = ['zhangsan',23,'BeiJing']list2 = ['BeiJing','zhangsan',23]list1 == list2Falsedic1 = {'name':'zhangsan','age':23,'address':'BeiJing'}dic2 = { 'age':23,'name':'zhangsan','address':'BeiJing'}dic1 == dic2True

由以上实例可以看出,当列表元素内容一致,顺序不同再对比内容时匹配不成功,同理字典值匹配成功,说明字典中元素内容不按顺序存放。

文中示例代码:python-100-days[1]

总结

本节给大家介绍了 Python 数据结构之字典的操作与使用,对 Python 工程师使用字典的一些基本知识提供了支撑。

参考:

http://www.pythondoc.com/pythontutorial3 https://www.runoob.com/python3/python3-dictionary.html

参考资料

[1]

python-100-days: https://github.com/JustDoPython/python-100-day

系列文章

第10天:Python 类与对象

  • 第9天:Python Tupple

  • 第8天:Python List

  • 第7天:Python 数据结构--序列

  • 第6天:Python 模块和

  • 第5天:Python 函数

  • 第4天:Python 流程控制

  • 第3天:Python 变量与数据类型

  • 第2天:Python 基础语法

  • 第1天:Python 环境搭建

PS:公号内回复 :Python,即可进入Python 新手学习交流群,一起100天计划!-END-Python 技术关于 Python 都在这里

js计算字典的个数_第11天:Python 字典相关推荐

  1. python字典合并去重_十三、深入Python字典和集合

    「@Author :Runsen」 字典和集合 字典是一系列无序元素的组合,其长度大小可变,元素可以任意地删减和改变.不过要注意,这里的元素,是一对键(key)和值(value) 相比于列表和元组,字 ...

  2. python中字典的索引_按索引访问Python字典的元素

    正如我注意到您的描述一样,您只知道解析器会给您一个字典,它的值也是字典,如下所示:sampleDict = { "key1": {"key10": " ...

  3. 字典与集合_月隐学python第8课

    一.字典 字典属于无序列,元素存放无序,是通过哈希方式进行数据存取的,字典是一个可变容器,字典中保存一个的键值对: key : value.我们通过key来获取对应的值,很类似我们的汉语字典. 字典中 ...

  4. dictionary new一个实例_超全的Python 字典(Dictionary)介绍

    字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值 key=>value 对用冒号 : 分割,每个键值对之间用逗号 , 分割,整个字典包括在花括号 {} 中 ,格式如下所示: 键一 ...

  5. python字典{:4}_升级您的Python技能:检查字典

    python字典{:>4} by Adam Goldschmidt 亚当·戈德施密特(Adam Goldschmidt) 升级您的Python技能:检查字典 (Upgrade your Pyth ...

  6. python字典实例化对象_创建并实例化python2d字典

    我有两个python字典:ccyAr = {'AUDCAD','AUDCHF','AUDJPY','AUDNZD','AUDUSD','CADCHF','CADJPY','CHFJPY','EURAU ...

  7. html读取字典endfor,Flask和HTML,从python字典迭代到HTML表

    我有一本python字典data = { 'category1': { 'titles': ['t1', 't2', 't3'], 'dates': ['d1', 'd2', 'd3'] }, 'ca ...

  8. 计算字典的个数_[LeetCode] 440. 字典序的第K小数字

    题目链接: https://leetcode-cn.com/problems/k-th-smallest-in-lexicographical-order 难度:困难 通过率:28.4% 题目描述: ...

  9. mysql计算单词的个数_统计单词个数

    统计单词个数 统计单词个数的功能是封装在Linux驱动中的. Linux驱动 Linux系统将每一个驱动都映射成一个文件,为设备文件或驱动文件,都保存在/dev目录中.与Linux驱动交换数据变成了与 ...

  10. python 找质数的个数_盘一盘 Python 系列特别篇 All 和 Any

    本文含 3758 字,9图表截屏建议阅读 10 分钟 本文是 Python 系列的特别篇的第十四篇 特别篇 1 - PyEcharts TreeMap 特别篇 2 - 面向对象编程 特别篇 3 - 两 ...

最新文章

  1. Ubuntu 11.10更新源地址列表更改方法及下载
  2. 文件操作中关于文件句柄的相关操作
  3. oracle o7参数,Oracle技术之初始化参数O7_DICTIONARY_ACCESSIBILITY
  4. OSGL 工具库 - 类型转换的艺术
  5. Spring-aop-Advisor接口与Pointcut接口
  6. 几十m的中文linux系统,体积只有十几M的linux系统Tiny Core安装体验
  7. cpython是什么_CPython是什么?PyPy是什么?Python和这两个东西有什么关系?
  8. 还原 idea undo commit
  9. Leetcode 颜色分类
  10. 3dmax外挂神器更新了|3dmax外挂在过去几年里,食住玩都更新记录了3dmax外挂的什么功能?
  11. 奥斯汀页眉怎么设置_word页眉怎么插入及删除
  12. 微信安卓6.5.3以上版本网页上传不了图片的解决方案
  13. c# webbrowser html5,C#设置WebBrowser IE浏览器版本
  14. @老徐FrankXuLei 受邀为上海师翊网络科技有限公司讲授《微软WCF分布式开发与SOA架构设计课程》
  15. 金蝶云星空和小满OKKICRM单据接口对接
  16. git命令提交后push失败,缺少changeID的解决办法
  17. .Net/C#: 一个将在线简体中文网页转为繁体中文页简单方法
  18. 博弈论在自动驾驶方向的应用(Ⅰ):变道决策的综述
  19. 表格布局管理器TableLayout
  20. linux路径跟踪命令,Linux基础命令---tracepath追踪路由信息

热门文章

  1. Linux进程间通信--命名管道
  2. erlang中如何调试程序
  3. SecondaryNamenode配置与NameNode故障恢复
  4. JavaScript实现继承机制(1)—— 构造函数方法对象冒充
  5. Extjs textfield keyup事件
  6. SpringMVC相关面试题总结
  7. Oracle 数据库常用操作总结二之数据库的导入和导出
  8. Spring依赖注入@Autowired原理解析(一)之寻找需要注入的属性
  9. Video Target Tracking Based on Online Learning—TLD多目标跟踪算法
  10. 双十二大前端工程师读书清单