本章主要讲述了关于字典的相关知识,字典是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("""+---------------+----------+----------+""")