day2-字典
一 概述
字典是一种key - value 的数据类型,使用就像我们上学用的字典,通过笔画,字母来查对应页的详细内容。
字典的特性:
- dict是无序的
- key必须是唯一的
二 语法
语法
info = { 'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia' }
三 基本用法
1.增加
>>> info = { ... 'stu1601': 'gangtiexia', ... 'stu1602': 'zhizhuxia', ... 'stu1603': 'jianbingxia' ... } >>> info {'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia'} >>> info['stu1605'] = '绿巨人' >>> info {'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia', 'stu1605': '绿巨人'}
2. 修改
>>> info {'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia', 'stu1605': '绿巨人'} >>> info['stu1601'] = '钢铁侠' >>> info {'stu1601': '钢铁侠', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia', 'stu1605': '绿巨人'}
3. 删除(del pop popitem)
>>> info {'stu1601': '钢铁侠', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia', 'stu1605': '绿巨人'} >>> info.pop('stu1601') #标准删除姿势 '钢铁侠' >>> info {'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia', 'stu1605': '绿巨人'} >>> del info['stu1602'] #换个删除姿势 >>> info {'stu1603': 'jianbingxia', 'stu1605': '绿巨人'} >>> info.popitem() #随机删除 ('stu1605', '绿巨人') >>> info {'stu1603': 'jianbingxia'}
4. 查找
>>> info {'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia'} >>> 'stu1601' in info #标准用法 True >>> info.get('stu1602') #获取 'zhizhuxia' >>> info['stu1603'] #同上,但是看下面 'jianbingxia' >>> info['stu1604'] #如果一个key不存在,报错,get不会,不存在只返回None Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'stu1604'
5.多级字典嵌套及操作
av_catalog = { "欧美":{ "www.youporn.com": ["很多免费的,世界最大的","质量一般"], "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"] }, "日韩":{ "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"] }, "大陆":{ "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] } } av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来" print(av_catalog["大陆"]["1024"]) #ouput ['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']
四 其他用法
1. values()
以列表返回一个字典所有的值
>>> info {'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia'} >>> info.values() dict_values(['gangtiexia', 'zhizhuxia', 'jianbingxia'])
2. keys()
以列表返回一个字典所有的键
>>> info {'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia'} >>> info.keys() dict_keys(['stu1601', 'stu1602', 'stu1603'])
3. setdefault(key, default=None)
如果键不存在于字典中,将会添加键,并将值设为默认值;如果字典中包含给定的键,则返回该键对应的值
>>> info {'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia'} >>> info.setdefault('stu1601','钢铁侠') #存在的key 'gangtiexia' >>> info {'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia'} >>> info.setdefault('stu1604','钢铁侠') #不存在的key '钢铁侠' >>> info {'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia', 'stu1604': '钢铁侠'}
4.dict.update(dict2)
把字典dict2的键值对更新到dict里,合并两个字典
>>> info {'stu1601': 'gangtiexia', 'stu1602': 'zhizhuxia', 'stu1603': 'jianbingxia', 'stu1604': '钢铁侠'} >>> b = {'stu1602':'蜘蛛侠','1':'2',3:4} >>> info.update(b) #把字典b的键值对更新到info里 >>> info {'stu1601': 'gangtiexia', 'stu1602': '蜘蛛侠', 'stu1603': 'jianbingxia', 'stu1604': '钢铁侠', '1': '2', 3: 4}
5. items()
以列表返回可遍历的(键,值)元组数组
>>> info {'stu1601': 'gangtiexia', 'stu1602': '蜘蛛侠', 'stu1603': 'jianbingxia', 'stu1604': '钢铁侠', '1': '2', 3: 4} >>> info.items() dict_items([('stu1601', 'gangtiexia'), ('stu1602', '蜘蛛侠'), ('stu1603', 'jianbingxia'), ('stu1604', '钢铁侠'), ('1', '2'), (3, 4)])
6. fromkeys(序列,默认值)
初始化一个字典
>>> dict.fromkeys(['a','b'],1) {'a': 1, 'b': 1}
7. clear()
清空字典
>>> info {'stu1601': 'gangtiexia', 'stu1602': '蜘蛛侠', 'stu1603': 'jianbingxia', 'stu1604': '钢铁侠', '1': '2', 3: 4} >>> info.clear() >>> info {}
5. 循环dict
#方法1 for key in info: print(key,info[key]) #方法2 for k,v in info.items(): #会先把dict转成list,数据量大时莫用 print(k,v)
小结:
- 方法1的效率比方法2的效率高很多
- 方法1是直接通过key取value
- 方法2是先把字典转换成一个列表,再去取值
- 当数据量比较大的时候,用第二种方法时,字典转换成列表的这个过程需要花大量的时间老转换,当然数据量不大,没有关系,效率差不多
6. 知识扩展
1. 合并两个字典的多种方法
>>> dic1 = {'a':1,"b": 2} >>> dic2 = {'c':3,"d": 4} # 方法一 >>> res = {} >>> res.update(dic1) >>> res.update(dic2) >>> res {'a': 1, 'b': 2, 'c': 3, 'd': 4} #方法二 >>> def update(dic1,dic2): ... for key, value in dic2.items(): ... dic1[key] = value ... >>> update(dic1,dic2) >>> dic1 {'a': 1, 'b': 2, 'c': 3, 'd': 4} #方法三 >>> dic1 = {'a':1,"b": 2} >>> dic2 = {'c':3,"d": 4} >>> res3 = dict(dic1, **dic2) >>> res3 {'a': 1, 'b': 2, 'c': 3, 'd': 4} #方法四 >>> dic1 = {'a':1,"b": 2} >>> dic2 = {'c':3,"d": 4} >>> res4 = {**dic1, **dic2} >>> res4 {'a': 1, 'b': 2, 'c': 3, 'd': 4}