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. 方法1的效率比方法2的效率高很多
  2. 方法1是直接通过key取value
  3. 方法2是先把字典转换成一个列表,再去取值
  4. 当数据量比较大的时候,用第二种方法时,字典转换成列表的这个过程需要花大量的时间老转换,当然数据量不大,没有关系,效率差不多

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}

 

posted @ 2017-12-28 17:03  Easonlou  阅读(365)  评论(0编辑  收藏  举报