合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
[TOC] ---- # 字典 ## 为什么需要字典: 有时候我们需要存储一组相关的数据的时候, 比如要存储一个人的信息,那么有username,age,birthday等, 如果这些信息都存储在列表中,或者数组中, 比如['username','age','birthday']那么用起来可能不是很方便。 比较方便的操作是,我直接通过username这个key就可以拿到这个值, 我通过username就可以给这个key设置值, 那么就可以通过字典的方式实现我们的需求。 字典 可以理解为键值对形式的`json格式字符串形式` 或者 `php中的关联数组` 1. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 , 格式如下所示: >d = {key1 : value1, key2 : value2 } 1. 字典是另一种可变容器模型,且可存储任意类型对象。 1. 键必须是唯一的,但值则重复。 1. 值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。 1. 元素是无序的 一个简单的字典实例: >dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'} ## 创建字典: ```python #方法一: dict1 = { 'abc': 456 }; dict2 = { 'abc': 123, 98.6: 37 }; #方法二: info = {} info['name']=name info['age']=age info['gender']=gender #输出 print(info) #{'name': 'lisi', 'age': 20, 'gender': '男'} print(info['name']) #lisi print(info['age']) #20 # print(info['color']) #20 报异常 # 也可以指定一个,在没有获取到这个值时候的默认值 print(info.get('color','red')) #red 方法三:使用dict函数: person = dict(username='zhiliao',age=18) #{'username': 'zhiliao', 'age': 18} print(person) ``` ## 基本操作: - len(d):返回字典的键值对的长度。 - d[k]:获取k这个key对应的值。 - d[k] = v:设置键为k的值为v,如果字典中不存在键为k的这一项,那么自动的添加进去。 - del d[k]:删除d这个字典中键为k的这一项数据。 - k in d:检查d这个字典中是否包含键为k的这一项。 - 字典中的键可以是任意的不可变类型,比如:浮点类型、整形、长整形、字符串或者元组。 ## 字典常用方法: 1. clear:清除字典中所有的项。 ```python a = {'username':'zhiliao','age':18} print(a) #{'username': 'zhiliao', 'age': 18} a.clear() print(a) #{} ``` 1. get:访问字典中那个键对应的那个值。这个方法不会抛出异常。 ```python a = {'username':'zhiliao','age':18} username = a.get('username') print(username) #print(city) city = a.get('city') # 获取到的是一个None。 print(city) #None # 也可以指定一个,在没有获取到这个值时候的默认值 city = a.get('city','changsha') print(city) #changsha # city = a['city'] # print(city) # 抛出异常 ``` 1. pop:用来获得对应于给定键的值,然后将这个键和值的项从字典中删除。会返回这个值。 ```python d = {'x':1,'y':2} b=d.pop('x') print(b) # 1 print(d) # {'y': 2} ``` 1. popitem:随机的移除字典中的一项。因为字典是无序的,所以是随机的。 ```python d= {'name': '菜鸟教程', 'alexa': 10000, 'url': 'www.runoob.com'} a=d.popitem() # 随机弹出一个值 print(d) # {'name': '菜鸟教程', 'alexa': 10000} print(a) #('url', 'www.runoob.com') ``` 1. update:用一个字典更新另外一个字典,如果碰到相同的键,则会覆盖。 ```python a = {'url':'http://www.baidu.com/','title':"baidu"} b = {"url":"http://www.google.com/",'new_value':"new_value"} a.update(b) print(a) #{'url': 'http://www.google.com/', 'title': 'baidu', 'new_value': 'new_value'} ``` 1. setdefault:如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。 1. key in dict if k in dict:判断某个键是否在字典中存在。 ```python dict = {'Name': 'Runoob', 'Age': 7} # 检测键 Age 是否存在 if 'Age' in dict: print("键 Age 存在") else : print("键 Age 不存在") # 检测键 Sex 是否存在 if 'Sex' in dict: print("键 Sex 存在") else : print("键 Sex 不存在") # not in # 检测键 Age 是否存在 if 'Age' not in dict: print("键 Age 不存在") else : print("键 Age 存在") # 以上实例输出结果为: # 键 Age 存在 # 键 Sex 不存在 # 键 Age 存在 ``` ## 遍历字典: 1. 遍历字典中所有的key:使用keys方法,这个方法将所有的键以列表的方式返回。 ```python a = {"url":"www.baidu.com",'title':"baidu"} for x in a.keys(): print x ``` 1. 遍历字典中所有的key:使用iterkeys方法,这个方法将返回一个迭代器,用来遍历所有的键的。 ```python a = {"url":"www.baidu.com",'title':"baidu"} for x in a.iterkeys(): print x ``` 1. 遍历字典中所有的value:使用values方法,这个方法将所有的值以列表的方式返回。 ```python a = {"url":"www.baidu.com",'title':"baidu"} for x in a.values(): print x ``` 1. 遍历字典中所有的value:使用itervalues方法,这个方法将返回一个迭代器,用来遍历所有的值。 ```python a = {"url":"www.baidu.com",'title':"baidu"} for x in a.itervalues(): print x ``` 1. 遍历字典中所有的键值对:使用items方法,这个方法将所有的键和值以列表的方式返回。 ```python a = {"url":"www.baidu.com",'title':"baidu"} for key,value in a.items(): print key print value ``` 1. 遍历字典中所有的键值对:使用iteritems方法,这个方法将返回一个迭代器,用来遍历所有的键和值。 ```python a = {"url":"www.baidu.com",'title':"baidu"} for key,value in a.iteritems(): print key print value ``` 手册: <a href="https://www.runoob.com/python3/python3-dictionary.html" target="_blank ">https://www.runoob.com/python3/python3-dictionary.html</a> ## 直接赋值和 copy 的区别 可以通过以下实例说明: ```python dict1 = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'} dict2 = dict1.copy() print ("新复制的字典为 : ",dict2) #新复制的字典为 : {'Name': 'Runoob', 'Age': 7, 'Class': 'First'} dict1 = {'user':'runoob','num':[1,2,3]} dict2 = dict1 # 浅拷贝: 引用对象 dict3 = dict1.copy() # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用 # 修改 data 数据 dict1['user']='root' dict1['num'].remove(1) # 输出结果 print(dict1) #{'user': 'root', 'num': [2, 3]} print(dict2) #{'user': 'root', 'num': [2, 3]} print(dict3) #{'user': 'runoob', 'num': [2, 3]} ``` ## 浅拷贝和深拷贝的区别 <a href="https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html" target="_blank">https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html</a>