• 1.12 字典(Python)


    本文来自异想之旅公开发布的Python教程,原文地址:https://www.yuque.com/yxzl/python

    在前面的学习中,我们接触了“存储数据的容器”变量和“存储多个数据的容器”列表。然而在实际的使用中,更多的情况下我们并不在意列表所能提供的数据的有序性,更在意能否快速根据给定的信息查询相关数据:例如根据姓名查询身份证号、根据班级查询学生……

    这就需要用到字典这种东西了。

    简单的示例

    # 本代码以上文提到的“根据姓名查询身份证号”的功能为例
    
    # 我们使用大括号定义一个字典
    data = {'小明': '370202xxxxxxxxxxxx', '小红': '620104xxxxxxxxxxxx'}
    
    # 我们使用像访问列表一样的中括号访问字典中的数据
    # 例如 data[x] ,其中 x 表示要访问的键,程序会返回对应的值
    print(data['小明'])
    print(data['小红'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    程序输出:

    370202xxxxxxxxxxxx
    620104xxxxxxxxxxxx
    
    • 1
    • 2

    字典由**键值对(key-value pairs)**构成。格式:{a1: b1, a2: b2, ...},其中 a 表示键(key),b 表示值(value),a 与 b 共同组成键值对。

    当然,键值对的数据类型不仅仅局限于字符串。键的类型可以是int``float``str``bool可哈希固定的类型,值可以是任意的值或 Python 对象。

    名词解释:哈希,……,嗯好吧这个不太好通俗解释,维基百科解释为“一种从任何一种数据中创建小的数字‘指纹’的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。”。其重点一个是“指纹”所表明的唯一性(不重复性),另一个也还是上面说到的确定性。
    以上提到的四种类型再加上tuple几乎是你可以接触到的 Python 内置的所有符合键要求的类型,更多的类型需要手动去定义。
    “值可以是任意的值或 Python 对象”这句话并不严谨,事实上包括str甚至int等在内,Python 的一切都是对象。具体概念你将在本书的第二部分了解到。

    键值对的增加和修改

    增加和修改的格式一样,直接使用形如dict[key] = value的语句即可;对于已经存在的键值对,也可以直接当作变量操作,例如dict[key] += 1

    具体请看如下示例:

    child = {'name': 'Yxzl', 'age': 8, 'weight': '25kg'}
    
    # 添加一个新的键值对
    child['height'] = '150cm'
    # 对已有的键值对的值进行修改
    child['age'] += 1
    child['weight'] = '30kg'
    
    print(child)  # {'name': 'Yxzl', 'age': 9, 'weight': '30kg', 'height': '150cm'}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    此处有一个事情需要注意:Python 字典的键值对是不保证有序的。

    键值对的访问

    来看一个示例:

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

    输出:

    Traceback (most recent call last):
      File "/path/to/example.py", line 2, in 
        print(a['c'])
    KeyError: 'c'
    
    • 1
    • 2
    • 3
    • 4

    可以看到,我们访问了a中不存在的键'c',程序运行时抛出了键错误,也就是说通过我们提供的键找不到对应的键值对,自然也找不到对应的值。

    在真实的使用中,很多时候我们无法确定字典中是否有我们所查找的值。如果直接使用方括号去访问,程序找不到数据就抛出错误终止程序,这往往并不是我们期望的。因此,Python 提供了一种更优雅的方式来获取字典中的数据:

    a = {'a': 1, 'b': 2}
    
    print(a.get('a'))  # 输出:1
    print(a.get('c'))  # 输出:None
    print(a.get('c', -1))  # .get()的第二个参数指定找不到对应数值时返回的默认值,输出:-1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这样子即便找不到键值对也不会抛出错误啦,判断键值对是否存在只需要if dict.get(key) is None即可(关于is语句的用法将在第二部分面向对象中具体讲解)。

    字典遍历

    我们可以使用for循环遍历字典中的键值对。这里我们会用到一个略有不同的语句结构for i, j in ...,想要真正理解它需要元组相关的知识,我将看心情写在第二部分中,此处还是先作为固定格式记忆好啦。

    child = {'name': 'Yxzl', 'age': 8, 'weight': '25kg'}
    
    print('Keys:')
    for i in child.keys():  # 遍历字典中的键
        print(i)
    
    print()
    
    print('Values:')
    for i in child.values():  # 遍历字典中的值
        print(i)
    
    print()
    
    print('Key-Value Pairs:')
    for i, j in child.items():  # 遍历字典中的键值对
        print(i, j)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    程序输出:

    Keys:
    name
    age
    weight
    
    Values:
    Yxzl
    8
    25kg
    
    Key-Value Pairs:
    name Yxzl
    age 8
    weight 25kg
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    字典方法

    一看就懂,还是直接上代码~

    a = {'a': 1, 'b': 2, 'c': 3}
    
    print(len(a))  # 获取字典的长度(即键值对的个数),输出:3
    
    print(a.pop('a'))  # 通过键删除对应的键值对,返回对应键值对的值,输出:1
    print(a)  # 输出:{'b': 2, 'c': 3}
    
    print('a' in a, 'b' in a)  # 判断字典中是否存在某个键,输出:False True
    
    b = {'d': 4, 'e': 5, 'f': 6}
    a.update(b)  # 合并字典,将b中的键值对更新到a中
    print(a)  # 输出:{'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6}
    
    a.clear()  # 清空字典
    print(a)  # 输出:{}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    一文带你认识AscendCL
    力扣第312场周赛题解:
    软件设计原则
    开源大数据集群部署(十五)Zookeeper集群部署
    Groovy的规则脚本引擎实战
    avalanche 少量tcp长连接持续构建HTTP请求测试
    【性能优化】MySQL索引失效的原因以及如何进行SQL优化
    浏览器缓存机制
    Cmake 生成器表达式
    阿里P8熬了一个月肝出这份32W字Java面试手册,在Github标星31K+
  • 原文地址:https://blog.csdn.net/weixin_44495599/article/details/126184663