美文网首页
16_字典(dict)

16_字典(dict)

作者: 秋的懵懂 | 来源:发表于2018-11-05 13:55 被阅读0次

    时间:2018-11-03 作者:魏文应


    一、字典

    什么是字典?

    • 字典属于一种新的数据结构,称为映射(mapping)。
    • 字典的作用和列表类似,都是用来存储对象的容器。
    • 列表存储数据的性能很好,但是查询数据的性能很差。
    • 在查询元素时,字典的效率是非常快的。
    • 在字典中,每一个元素都有一个唯一的名字,通过这个唯一的名字,可以快速的查找到指定的元素。

    在字典中,可以保存多个对象,每个对象都会有一个唯一的名字:

    • 这个唯一的名字,我们称其为 键(key),通过 key 可以快速的查询 value 。
    • 这个对象,我们称其为值(value)。
    • 所以字典,我们也叫做 键值对(key-value) 结构 。
    • 每一个键值对,我们称其为一项(item)。

    创建字典

    字典通过大括号 { } 进行创建,例如:

    d = {} # 创建了一个空字典
    

    字典创建的语法如下:

    # 字典的值可以是任意对象
    # 字典的键可以是任意的不可变对象(int、str、bool、tuple ...)
    #     字典的键不能重复,一般用字符串 str。
    {key:value, key:value, key:value}
    

    例如:

    d = {
        'name': '孙悟空',
        'age': 18,
        'gender': '男'
    }
    
    print(d['name'], d['age'], d['gender'])
    

    通过 索引到了 ,打印结果如下:

    孙悟空 18 男
    

    dict() 函数创建字典

    使用 dict() 函数创建字典:

    d = dict(name='孙悟空', age=18, gender='男')
    print(d, type(d))
    

    这种方式创建的字典,key 都是字符串,打印结果如下:

    {'name': '孙悟空', 'age': 18, 'gender': '男'} <class 'dict'>
    

    dict() 函数,也可以将一个包含有 双值子序列的序列 转换为字典:

    d = dict([('name', '孙悟空'), ('age', 18)])
    print(d, type(d))
    

    子序列中,前面一个元素为键,后面一个元素为值,打印结果如下:

    {'name': '孙悟空', 'age': 18} <class 'dict'>
    

    双值序列

    序列中只有两个字值的序列叫做 双值序列,比如下面的都是双值序列:

    [1, 3]
    ['a', 1]
    'ab'
    

    子序列

    如果序列中的元素也是序列,那么称这个元素为 子序列。比如:

    [(1, 3), (3, 5)]
    

    获取键值对个数

    可以通过 len() 函数,获取字典中键值对的个数,比如:

    d = {'a':1, 'b':2, 'c':3}
    print(len(d))
    

    这就获取了字典 d 中的键值对个数,打印结果如下:

    3
    

    检查是否包含某个键

    可以使用 in 检查字典中是否包含某个键,比如:

    d = {'a': 1, 'b': 2, 'c': 3}
    print('hello' in d)
    

    上面,检查 hello 这个键在不在 d 这个字典中,打印结果如下:

    False
    

    get() 方法获取键

    可以使用 get() 方法,来获取键,如果键不存在,返回 None 。比如:

    d = {
        'name': '孙悟空',
        'age': 18,
        'gender': '男'
    }
    
    print(d.get('name'))  # 返回键值孙悟空
    print(d.get('hello'))  # hello 键没有,返回 None
    print(d.get('hello', '没有hello'))  # 没有hello键时,返回 '没有hello'
    

    如果直接使用 d['hello'] 去索引字典,程序会因为字典没有这个键而报错,通过get()方法则不会报错,打印结果如下:

    孙悟空
    None
    没有hello
    

    修改字典

    可以通过 d[key] = value 的方式,来进行字典元素值的修改:

    d = {'name': '孙悟空','age': 18,'gender': '男'}
    d['name'] = 'sunwukong'
    print(d)
    

    上面,修改了键为 name 的值,打印结果如下:

    {'name': 'sunwukong', 'age': 18, 'gender': '男'}
    

    如果没有对应的键,则在字典末尾自动添加,比如:

    d = {'name': '孙悟空','age': 18,'gender': '男'}
    d['address'] = '花果山'
    print(d)
    

    上面,因为没有 address 这个键,所以,就自动在末尾添加一个键值对 'address': '花果山',打印结果如下:

    {'name': '孙悟空', 'age': 18, 'gender': '男', 'address': '花果山'}
    

    可以使用 setdefualt(key[, default]) 方法,来向字典添加 key-value :

    • 如果 key 已经存在于字典中,则返回 key 值,不会对字典做任何操作。
    • 如果 key 不存在,则向字典中添加这个 key ,并设置 value 。
    d = {'name': '孙悟空', 'age': 18, 'gender': '男'}
    d.setdefault('name', '猪八戒')
    print(d)
    d.setdefault('address', '花果山')
    print(d)
    

    所以,打印结果如下:

    {'name': '孙悟空', 'age': 18, 'gender': '男'}
    {'name': '孙悟空', 'age': 18, 'gender': '男', 'address': '花果山'}
    

    合并字典

    可以使用 update() 方法,合并字典,如果遇到相同的键,则更新这个键的值。比如:

    d = {'a': 1, 'b': 2, 'c': 3}
    d2 = {'d': 4, 'e': 5, 'f': 6, 'a': 7}
    d2.update(d)
    print(d2)
    

    d 被合并到了 d2 后面,相同的键名 a 的对应的值被更新了,打印结果如下:

    {'d': 4, 'e': 5, 'f': 6, 'a': 1, 'b': 2, 'c': 3}
    

    删除字典中的键值对

    可以使 del 删除字典中的一个键值对,例如:

    d = {'a': 1, 'b': 2, 'c': 3}
    del d['a']
    print(d)
    

    上面,就会把键值对 'a': 1 删除掉,打印结果如下:

    {'b': 2, 'c': 3}
    

    如果没有对应的键名,则会报错,比如:

    d = {'a': 1, 'b': 2, 'c': 3}
    del d['f']    # 这里会报错
    

    还可以使用 popitem()随机删除 字典中的一个键值对,一般都会删除最后一个键值对:

    • 删除之后,它会将删除的 key-value 作为返回值返回。
    • 返回的是一个元组,元组中有两个元素,第一个是已经删除的 key,第二个是删除的 value 。
    d = {'a': 1, 'b': 2, 'c': 3}
    result = d.popitem()
    print('result =',result)
    print(d)
    

    打印结果如下:

    result = ('c', 3)
    {'a': 1, 'b': 2}
    

    还可以使用 pop() 方法进行删除指定的键值对:

    • 根据 key 删除字典中的 key-value 。
    • 如果删除不存在的 key ,会抛出异常。
    • 如果指定了默认值,当遇到不存在的 key 时,不会报错,而是直接返回默认值。
    d = {'a': 1, 'b': 2, 'c': 3}
    result = d.pop('a')
    print('result =', result)
    print(d)
    result = d.pop('f', '键值不存在')
    print('result =', result)
    

    打印结果如下:

    result = 1
    {'b': 2, 'c': 3}
    result = 键值不存在
    

    清空字典(clear)

    可以使用 clear() 方法,清空字典内的所有键值对:

    d = {'a': 1, 'b': 2, 'c': 3}
    d.clear()
    print(d)
    

    上面,清空了字典 d 内的所有键值对,打印结果如下:

    {}
    

    浅复制

    可以使用 copy() 方法进行复制操作,将一个字典 d 复制到 d2 中。注意:

    • 浅复制只是简单复制对象的值,如果值是一个 可变对象,这个可变对象不会被复制。
    d = {'a': {'name': '猪八戒'}, 'b': 2, 'c': 3}
    d2 = d.copy()
    d2['a']['name'] = '孙悟空'
    d2['b'] = 11
    print('d =', d, id(d))
    print('d2 = ', d2, id(d2))
    

    上面, dd2 是相互对立的,但键值对 'a': {'name': '猪八戒'} 的值是一个可变对象,d2['a']['name'] = '孙悟空' 会使得 dd2都发生改变。可以理解为,字典 dd2 的键值对的值只是保存了变量的地址。

    遍历字典

    字典的遍历,有多种方法,可以使用 keys() 方法,获取 键值对

    d = {'a': {'name': '猪八戒'}, 'b': 2, 'c': 3}
    for k in d.keys():
        print(k, d[k])
    

    上面,打印结果如下:

    name 沙和尚
    b 2
    c 3
    

    也可以通过 value() 方法,但这样只获取到

    d = {'name': '沙和尚', 'b': 2, 'c': 3}
    for v in d.values():
        print(v)
    

    上面,打印结果如下:

    沙和尚
    2
    3
    

    还可以使用 items() 方法,它会返回序列,序列中包含有 双值子序列

    d = {'name': '沙和尚', 'b': 2, 'c': 3}
    print(d.items())
    for k, v in d.items():
        print(k, '=', v)
    

    打印结果如下:

    dict_items([('name', '沙和尚'), ('b', 2), ('c', 3)])
    name = 沙和尚
    b = 2
    c = 3
    

    相关文章

      网友评论

          本文标题:16_字典(dict)

          本文链接:https://www.haomeiwen.com/subject/qrbkxqtx.html