python 字典(Dictionary)

发布时间:2018-02-24 15:25:05编辑:admin阅读(3440)

    字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。

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

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

    d = {key1 : value1, key2 : value2 }

    键必须是唯一的,但值则不必。


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


    字典的特性:


    dict是无序的

    key必须是唯一的,so 天生去重


    举个例子,下面是一个班级同学信息

    info = {
        'stu1101': "Zhang San",
        'stu1102': "Li Si",
        'stu1103': "Wang Wu",
    }
    print(info)

    执行输出

    {'stu1101': 'Zhang San', 'stu1102': 'Li Si', 'stu1103': 'Wang Wu'}


    查询

    通过key查找

    print(info.get("stu1101"))

    执行输出 Zhang San

    如果不存在,输出 None


    还有一种方法,也可以查询,效果同上

    print(info["stu1101"])

    如果不存在,就报错

    不推荐使用此方法


    修改

    info["stu1101"] = "Zhang Yi Xin"
    print(info)

    执行输出

    {'stu1101': 'Zhang Yi Xin', 'stu1102': 'Li Si', 'stu1103': 'Wang Wu'}


    添加

    如果修改的key不存在,则添加

    info["stu1104"] = "Feng Shao Feng"
    print(info)

    执行输出

    {'stu1101': 'Zhang San', 'stu1102': 'Li Si', 'stu1103': 'Wang Wu', 'stu1104': 'Feng Shao Feng'}


    删除

    info["stu1104"] = "Feng Shao Feng"
    info.pop("stu1103")
    print(info)

    执行输出

    {'stu1101': 'Zhang San', 'stu1102': 'Li Si', 'stu1104': 'Feng Shao Feng'}


    另外一个方法,也可以实现删除,效果同上

    info["stu1104"] = "Feng Shao Feng"
    del info["stu1103"]
    print(info)


    判断一个key是否存在字典中,可以使用in方法

    print("stu1101" in info)

    执行输出 True,不存在时,返回false


    打印所有的值

    print(info.values())

    执行输出,不包括key

    dict_values(['Zhang San', 'Li Si', 'Wang Wu'])


    打印所有的key

    print(info.keys())

    执行输出

    dict_keys(['stu1101', 'stu1102', 'stu1103'])


    setdefault() 函数和get() 方法类似, 如果键不存在于字典中,将会添加键并将值设为默认值。

    #删除一个key
    info.pop("stu1101")
    info.setdefault('stu1101',"Zhang Xue You")
    print(info)

    执行输出

    {'stu1102': 'Li Si', 'stu1103': 'Wang Wu', 'stu1101': 'Zhang Xue You'}


    以一个字典去并更新另外一个字典

    info = {
        'stu1101': "Zhang San",
        'stu1102': "Li Si",
        'stu1103': "Wang Wu",
    }
    b = {
        'stu1101': "Zhang Zi Cheng",
        1:3,
        2:5,
    }
    info.update(b)
    print(info)

    执行输出

    {'stu1101': 'Zhang Zi Cheng', 'stu1102': 'Li Si', 'stu1103': 'Wang Wu', 1: 3, 2: 5}


    从上可以看出,update()方法,将2个字典合并了,Key相同的值被后面一个更新了。


    将字典转换为列表

    info = {
        'stu1101': "Zhang San",
        'stu1102': "Li Si",
        'stu1103': "Wang Wu",
    }
    print(info.items())

    执行输出

    dict_items([('stu1101', 'Zhang San'), ('stu1102', 'Li Si'), ('stu1103', 'Wang Wu')])


    使用列表初始化一个字典

    c = dict.fromkeys([6,7,8],"test")
    print(c)

    执行输出
    {6: 'test', 7: 'test', 8: 'test'}


    fromkeys是存在一个坑的,举个例子:

    c = dict.fromkeys([6,7,8],[1,{"name":"jack"},333])
    print(c)
    #修改key为7的name值
    c[7][1]['name'] = "rose"
    print(c)

    执行输出

    {6: [1, {'name': 'jack'}, 333], 7: [1, {'name': 'jack'}, 333], 8: [1, {'name': 'jack'}, 333]}

    {6: [1, {'name': 'rose'}, 333], 7: [1, {'name': 'rose'}, 333], 8: [1, {'name': 'rose'}, 333]}


    怎么会这样?明明只修改了一个值,却都修改了。和浅copy类似的问题

    注意: fromkeys后面的值,最好是一层的,如果有多层,修改时,会全部修改。

    这个方法,尽量少用。


    循环字典

    方法1

    for key in info:
        print(key,info[key])

    执行输出

    stu1101 Zhang San

    stu1102 Li Si

    stu1103 Wang Wu


    方法2

    #会先把dict转成list,数据里大时莫用
    for k,v in info.items():
        print(k,v)

    执行输出,效果同上。


    推荐使用方法1

    因为方法1,直接使用key去遍历字典

    方法2,把数据转换为列表后,再输出,效率不够高效。

关键字