本章主要讲述了关于字典的相关知识,字典是python开发的一个重要的数据存储容器,重点理解字典的存储方式并能够灵活的运用到实际的问题中来。

一、字典的概念

1、字典的定义
        1. 字典是一种可变的容器,可以存储任意类型的数据
        2. 字典中的每个数据都是用"键"(key) 进行索引,而不象序列可以用下标来进行索引
        3. 字典中的数据没有先后顺序关系,字典的存储是无序的
        4. 字典中的数据以键(key)-值(value)对形式进行映射存储
        5. 字典的键不能重复,且只能用不可变类型作为字典的键
2、字典的字面值表示方式

        {} 括起来,以冒号(:) 分隔键-值对,各键-值对用逗号分隔开

3、创建空字典

        d = {}        # 空字典
        d = dict()

4、创建非空字典
d = {'name':'tarena', 'age': 15}
d = {1:'星期一', 2:"星期二"}
# 以下写法会出现问题(因为键不能重复)
d = {'a': 1, 'b': 2, 'a': '一'}  
5、字典的构造(创建)函数

        1、dict()                    #  创建空字典,等同于 {}
        2、dict(iterable)       # 用可迭代对象初始化一个字典
        3、dict(**kwargs)     # 关键字传参形式生成一个字典

示例:
d = dict()
d = dict([('name', 'tarena'), ('age', 15)])
d = dict(name='tarena', age=15)
6、字典的键、值的取值

字典的值(value)可以是任意类型

        字典的值可以是布尔值,数据,字符串,None,列表,元组,字典,以及后面要学到的集合,函数,类对象等所有类型

字典的键(key)必须为不可变类型的值
        不可变的类型:
                bool,int,float,complex,str,tuple,frozenset(固定集合)
                包括:None
        不能充当键的类型有:
                列表,字典,集合set
示例:
{“a”: ”a”}
{100: ”100”}
{True: ”True”}
{None: ”abc”}
{(1970,1,1): ”computer year”}

二、字典的基本操作

1、字典的键索引
        用[] 运算符可以获取和修改键所对应的值
        语法:
                字典[键]
        示例:
d = {'name': 'tarena', 'age': 15}
print('姓名:', d['name'], '年龄:', d['age'])
2、添加/修改字典的元素
       字典[键] = 值
d = {}
d[‘name’] = "xiaoming"    # 创建新的键值对
d[‘age’] = 15             # 创建新的键值对
d[‘age’] = 16             # 修改age键所对应的值
键索引赋值说明:
        当键不存在时,创建键并绑定键对应的值
        当键存在时,修改键绑定的对象

3、删除字典的元素
        del 语句 可以用来删除字典的键
        语法:
                del 字典[键]
        示例:
                d = {1:"星期一", 2:'星期二'}

                del d[2]

4、in 运算符(成员资格判断运算符)
        1. 可以用in运算符来判断一个键是否存在于字典中,如果存在则返回True,否则返回False
        2. not in 与 in 相反
示例:
d = {1: "One", 2: "Two", "三": 'Three'}
1 in d      # True
'二' in d   # False
3 not in d  # True
'One' in d  # False
  
5、字典的迭代访问(迭代出来的都是键)

        字典是可迭代对象,字典只能对键进行迭代访问

  示例:
    d = {1: "One", 2: "Two", "三": 'Three'}
    for k in d:
        print(k, '对应的值是:', d[k])

三、字典的方法

函数 说明
D代表字典对象  
D.clear() 清空字典
D.pop(key) 移除键,同时返回此键所对应的值
D.copy() 返回字典D的副本,只复制一层(浅拷贝)
D.update(D2) 将字典 D2 合并到D中,如果键相同,则此键的值取D2的值作为新值
D.get(key, default) 返回键key所对应的值,如果没有此键,则返回default
   
D.keys() 返回可迭代的 dict_keys 集合对象
D.values() 返回可迭代的 dict_values 值对象
D.items() 返回可迭代的 dict_items 对象

示例:



D.get(100没有此键值对”)     # 如果没有100这个key,返回没有此键值对


四、字典推导式

        字典推导式是用可迭代的对象依次生成字典的表达式
        语法:
                { 键表达式: 值表达式 for 变量 in 可迭代对象 [if 真值表达式]}
                注: [] 及其中的内容代表可省略
        说明:
                1. 先从可迭代对象中取值
                2. 用变量绑定
                3. 用if 进行条件判断,如果为真值则执行下一步
                4. 执行'键表达式'和 '值表达式' 然后加入到新字典中
        示例:
            生成一个字典,键为1~9的整数,值为键的平方
d = {x: x **2 for x in range(1, 10)}

五、字典与列表的比较

1、字典和列表

        1. 都是可变对象
        2. 索引方式不同,列表用整数索引,字典用键索引
        3. 字典的查找速度可能会快于列表(重要)
        4. 列表的存储是有序的,字典的存储是无序的

2、列表 和字典 的内部存储原理
        列表,顺序存储
        字典,映射存储

六、练习集

1、第一题

        No = [1001, 1002, 1005, 1008],names = ['Tom', 'Jerry', 'Spike', 'Tyke'],用上面No列表中的数据作为键,用names中的数据作为值,生成相应的字典:
        如:d = {1001: 'Tom', 1002: 'Jerry', ....}

  # 方法1:
    d = {No[i]: names[i] for i in range(len(No))}
  # 方法2:
    d = {n: names[No.index(n)] for n in No}
2、第二题

        输入一些单词和解释,将单词作为键,将解释作为值,将这些数据输入到字典中,当输入空的单词时结束输入;然后,输入查询的单词,给出单词对应的解释。

print("词典录入...")
dictionaries = []
while True:
    word = input("请输入单词:")
    if not word:
        print("词典录入完毕!!")
        break
    translate = input("请输入" + word + "的解释:")
    dictionaries = {word: translate}

print("单词查询...")
while True:
    word = input("请输入查询的单词:")
    if not word:
        break
    print(dictionaries.get(word))   # 查询不到 则返回None

3、第三题

输入任意个学生的信息:
学生信息有:
        姓名(字符串str)
        年龄(整数int)
        成绩(整数int)

当输入学生姓名为空时结束输入

    1) 将每个学生的信息形成字典,存于列表L 中:
      如:
      [{'name':'xiaozhang', 'age':20, 'score':97},
       {'name':'xiaoli', 'age':18, 'score':95},
       ....
      ]
    2) 以表格的形式打印所有学生的信息,如下:
       +---------------+----------+----------+
       |      name         |    age       |  score     |
       +---------------+----------+----------+
       |   xiaozhang     |    20        |    97        |
       |    xiaoli            |    18        |    95        |
       |    ......                |   ...          |   ...           |
       +---------------+----------+----------+

students_info = []
while True:
    n = input("请输入姓名:")
    if not n:
        break
    a = int(input("请输入年龄:"))
    s = int(input("请输入成绩:"))
    students_info.append({"name": n, "age": a, "score": s})

print("""+---------------+----------+----------+
|      name     |    age   |  score   |
+---------------+----------+----------+""")
for x in students_info:
    print("+",
          (x.get("name")).center(15),
          "|",
          str(x.get("age")).center(10),
          "|",
          str(x["score"]).center(10),
          "|",
          sep='')
print("""+---------------+----------+----------+""")

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐