#11 Python字典
前言
前两节介绍了python列表和字符串的相关用法,这两种数据类型都是有序的数据类型,所以它们可以通过索引来访问内部元素。本文将记录一种无序的数据类型——字典!
一、字典与列表和字符串的区别
-
字典是无序的,列表和字符串是有序的
-
字典使用 key-value(键-值对)存储,列表和字符串为单元素存储
-
字典的key值唯一,列表和字符串元素可以相同
-
字典的访问速度远高于列表和字符串的访问速度
-
字典通常被用作存储,列表和字符串常用来工作
二、字典的用法
在介绍其详细用法之前,先来看看其包含的方法:
in [1]: dir(dict) out[1]: ['__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
从上面可以看到,字典的方法屈指可数,麻雀虽小,五脏俱全啊
1.字典的初始化
通过前文可知,字典是被一对花阔号括起来,内部元素采用 key-value 形式存储的数据类型:
普通初始化:
in [5]: systems = {'windows':10,'linux':'centos 6'} # 初始化一个字典,含有不同的数据类型 in [6]: systems = {'windows':10,'windows':8} # 字典的 key 值必须唯一,虽然重复时不报错,但访问时有问题 in [7]: systems['windows'] # 访问windows时,随机给出一个值,这是不希望的,所以在创建字典时严格控制 key 的唯一 out[7]: 8 in [9]: systems = {'windows':10,'linux':{'centos': 6}} # 字典可以嵌套
高级初始化:dict.setdefault()
in [24]: systems # 之前存在的字典 out[24]: {'linux': 'centos 6', 'ubuntu': 17, 'windows': 10} in [27]: systems.setdefault('ios',12) # 使用dict.setdefault()方法传入新的 key-value:'ios':12 out[27]: 12 in [28]: systems out[28]: {'ios': 12, 'linux': 'centos 6', 'ubuntu': 17, 'windows': 10} in [29]: systems.setdefault('linux','centos 7') # setdefault方法对于字典里没有的key是新建,对于已经存在的key来说,则不会改变原有的值,并且返回原有的值 out[29]: 'centos 6' in [30]: systems # 可以看到已经存在的 'linux'的值并没有被改变 out[30]: {'ios': 12, 'linux': 'centos 6', 'ubuntu': 17, 'windows': 10} # 这种方法极为适合于未知的字典
通过列表初始化:dict.formkeys()
in [59]: systems={} # 创建一个空字典 in [61]: systems.fromkeys(['linux','windows','ios'],['centos 6',10,12]) out[61]: {'ios': ['centos 6', 10, 12], 'linux': ['centos 6', 10, 12], 'windows': ['centos 6', 10, 12]} # 可以看到,这种方法超级坑,并不是想象中的一一对应,而是一对多
2.字典的访问
通过字典名加一对方括号 dict[key] 来访问字典的元素:
in [11]: systems = {'windows':10,'linux':'centos 6'} in [12]: systems['windows'] out[12]: 10 in [13]: systems['linux'] out[13]: 'centos 6'
循环访问:字典本身是可以循环的:
in [14]: systems out[14]: {'linux': 'centos 6', 'windows': 10} in [15]: for key in systems: # 可以看到字典默认循环 key ...: print(key) ...: linux windows in [16]: for key in systems: # 可以通过方括号的访问方式来得到value值 ...: value = systems[key] ...: print(key,value) ...: linux centos 6 windows 10
更高级的循环访问:使用 dict.items()
in [17]: for key,value in systems.items(): # 使用字典方法items()来循环遍历字典,但是会把字典转换为列表,还是少用哇 ...: print(key,value) ...: linux centos 6 windows 10
3.字典的增加和修改
字典的增加:dict[新的key] = 新的value
in [19]: systems out[19]: {'linux': 'centos 6', 'windows': 10} in [20]: systems['ubuntu'] = 16 # 直接增加即可 in [21]: systems out[21]: {'linux': 'centos 6', 'ubuntu': 16, 'windows': 10} # 通过上面代码明显发现字典是无序的
字典的修改:dict[存在的key] = 新的value
in [21]: systems out[21]: {'linux': 'centos 6', 'ubuntu': 16, 'windows': 10} in [22]: systems['ubuntu'] = 17 # 直接改就行 in [23]: systems out[23]: {'linux': 'centos 6', 'ubuntu': 17, 'windows': 10}
字典的更新:dict1.updata(dict2)
in [31]: systems1 = {'ios':12,'windows':8} in [34]: systems2 = {'linux':'centos 6','windows':10} in [35]: systems1.update(systems2) # 使用systems2更新systems1 in [36]: systems1 out[36]: {'ios': 12, 'linux': 'centos 6', 'windows': 10}
4.字典的删除
删除指定键值对方法1:dict.pop(key)
in [37]: systems out[37]: {'ios': 12, 'linux': 'centos 6', 'ubuntu': 17, 'windows': 10} in [38]: systems.pop('ios') # 删除'ios',并且返回其值 out[38]: 12 in [39]: systems out[39]: {'linux': 'centos 6', 'ubuntu': 17, 'windows': 10}
删除指定键值对方法2:使用del
in [39]: systems out[39]: {'linux': 'centos 6', 'ubuntu': 17, 'windows': 10} in [40]: del systems['linux'] in [41]: systems out[41]: {'ubuntu': 17, 'windows': 10}
随机删除键值对:dict.popitem()
in [41]: systems out[41]: {'ubuntu': 17, 'windows': 10} in [42]: systems.popitem() # 随机删除键值对,并返回此键值对 out[42]: ('windows', 10) in [43]: systems out[43]: {'ubuntu': 17}
清空字典元素:dict.clear()
in [64]: systems = {'linux':'centos 6','windows':10} in [65]: systems.clear() in [66]: systems # 字典仍然存在,只是变成了一个空字典 out[66]: {}
5.字典的查找
使用关键字 in :
in [46]: systems = {'linux':'centos 6','windows':10} in [47]: 'linux' in systems out[47]: true in [48]: 'iso' in systems out[48]: false
使用访问查找:
in [49]: systems out[49]: {'linux': 'centos 6', 'windows': 10} in [50]: systems['linux'] # 访问键值对,有返回值证明存在 out[50]: 'centos 6' in [51]: systmes['ios'] # 抛出异常,证明没有此元素 --------------------------------------------------------------------------- keyerror traceback (most recent call last) <ipython-input-51-e5e3f5004036> in <module> ----> 1 systmes['ios'] keyerror: 'ios'
使用 dict.get(key) 查找:
in [52]: systems out[52]: {'linux': 'centos 6', 'windows': 10} in [53]: systems.get('linux') # 查找'linux',有返回值,证明存在 out[53]: 'centos 6' in [54]: systems.get('ios') # 没有返回值,证明不存在 # 和访问的区别就在于没有此元素时,get方法不会报错
6.字典的统计
统计key:dict.keys()
in [55]: systems out[55]: {'linux': 'centos 6', 'windows': 10} in [56]: systems.keys() out[56]: dict_keys(['linux', 'windows'])
统计value:dict.values()
in [57]: systems out[57]: {'linux': 'centos 6', 'windows': 10} in [58]: systems.values() out[58]: dict_values(['centos 6', 10])
7.字典的拷贝
请参考列表的拷贝,大同小异ㄟ( ▔, ▔ )ㄏ
上一篇: 古代是从什么时候开始八股取士的?八股文的文体是什么?
下一篇: 用python画城市轮播地图