字典 dict
1.字典是一种可变的容器,可以存储任意类型的数据
2.字典中的每个数都是用“键”(key)进行索引,而不像序列可以用下标进行索引
3.字典中的数据没有先后关系,字典的存储是无序的
4.字典中的数据以键(key)-值 (value) 对的形式进行存储.
5.字典的键不能重复,且只能用不可变类型作为字典的键
字典的字面值表示方法:
字典的表示方式是用 {} 括起来,以冒号(:)分隔键-值对,各键值对之间用逗号分隔开
创建空字典的字面值: type(查询类型)
d = {} # 空字典
创建非空的字典
d ={"姓名":"小张","年龄":20}
d ={1:"一",2:"二",5:"五"}
dict的构造(创建)函数dict
dict() # 生成一个空的字典,等同于{}
dict(iterable) # 用可迭代对象创建一个字典
dict(**kwargs) # 用关键字传参形式生成一个字典
# (字典的键名必须是符合标识符命名规则的字符串)
# 示例:
d = dict()
L = [("姓名","小张"),["年龄",20],"AB"]
d = dict(L)
d = dict(name="小张",age=20)
字典的键(key)必须为不可变的数据类型,可以用数字,字符串,元组等充当字典的键
python3中不可变的数据类型:
bool,int,float,complex,str,tuple,frozenset(固定集合),bytes(字节串)
包括:None
python3中可变的数据类型:
# 列表list,字典dict,set(集合),bytearray(字节数组)
# (键 必须是不可改变的 值可以改变)
# 示例:
d = {"a":100}
d = {"a":(1,2,3)}
d = {(1,2,3):"a"}
d = {"a":[1,2,3]}
d = {[1,2,3]:"a"} #报错
d = {"a":{"b":100,"c":200}}
d = {{1:"一"}:"壹"} # 报错,字典不能做键
字典的基本操作
# 字典的键索引
# 用[]运算符可以获取字典内“键”所对应的“值”
# 取值语法:
# 变量 = 字典[键]
# 示例:
d = {"name":"tarena","age":20}
print(d["name"],"今年",d["age"],"岁")
添加和修改字典的键值对
# 语法:
# 字典[键] = 表达式
# 说明:
# 键不存在,创建键,并绑定键对应的值
# 键存在,修改键绑定的值
# 示例:
d = {}
d{"name"} = "tarena" # 创建新建值对
d["age"] = 15
d["age"] = 16 # 修改age 键对应的值为16
删除字典的元组 del语句
# 语法:
# del 字典[键]
# 作用:
# 删除字典的键,同时解除对值的绑定
# 示例:
d = {"name":"tarena","age":20}
del d["age"]
in / not in 运算符
# 用于字典中,in 运算符用来判断一个键是否在于字典中,如果存在则返回True,否则返回False
# not in(不在序列元素) 与 in(在序列元素) 结果相反
# 示例:
d = {"name":"tarena","age":15}
"name" in d #true
30 in d # False
"tarena" in d # False
15 not in d # True
# 注:只判断键是否在,不判断值是否存
练习
# 练习:
# 写程序,实现以下要求:
# 1.将如下数据形成一个字典seasons
# "键" "值"
# 1 -----> "春季有1,2,3月"
# 2 -----> "夏季有4,5,6月"
# 3 -----> "秋季有7,8,9月"
# 4 -----> "冬季有10,11,12月"
# 让用书输入一个整数代表这个季度,打印这个季度的信息,如果用户输入的信息不在字典内,则打印“信息不存在”
# 方法1
seasons = {
1 : "春季有1,2,3月",
2 : "夏季有4,5,6月",
3 : "秋季有7,8,9月",
4 : "冬季有10,11,12月",
}
print(seasons)
# 方法2
t = {}
t[1] = "春季有1,2,3月"
t[2] = "夏季有4,5,6月"
t[3] = "秋季有7,8,9月"
t[4] = "冬季有10,11,12月"
x = int(input("请输入季度(1~4)"))
if x in t:
print(t[x])
else:
print("信息不存在")
字典是可迭代对象
# 字典只能对键进行迭代访问
d = {"name":"tarnea","birthday":(2002,1,1)}
for k in d :
print(d)
字典的比较运算:
# 运算符:
== !=
# 说明:
# 只有键和值都完全相同时,才相等,否则不相等
# 示例:
{1:"一",2:"二"} == {1:"一",2:"二"} #True
{1:"一",2:"二"} == {1:"一",2:"2"} #False
可以用于字典的内建 函数
len(x) # 返回字典的键值对的个数
max(x) # 返回字典的键的最大值
min(x) # 返回字典的键的最小值
sum(x) # 返回字典中所有键的和
any(x) # 真值测试,如果字典中其中一个键为真值则返回True
all(x) # 真值测试,如果字典全部键为真值才返True
# 示例:
d = {0:"零",5:"伍",8:"捌",3:"叁"}
len(d) #4
max(d) #8
min(d) #0
sum(d) #16
any(d) #True
all(d) #False
字典的方法
# 方法 # 说明
# D 代表字典对象
D.clear() # 清空字典
D.pop(key) # 移除键,同时返回此键所对应的值
D.copy() # 返回字典D的副本,只复制一层(浅拷贝)
D.update(D2) # 将字典 D2 合并到D中,如果键相同,则此键的值取D2的值作为新值
D.get(key, default=None) # 返回键key所对应的值,如果没有此键,则返回default
D.keys() # 返回可迭代的 dict_keys 集合对象
D.values() # 返回可迭代的 dict_values 值对象
D.items() # 返回可迭代的 dict_items 对象
# 示例;
d1 = {1:"one",2:"二",3:"三"}
for t in d1.items():
print(t) #(1,"one"),(2,"二"),(3:"三")
for k,v in d1.items():
print("k=",k,"v=",v)
练习
# 写一个程序,输入一个字符串,写程序统计出这个字符串的字符个数的字符的种类
# 如:
# 请输入: ABCDABCABA
# 输出结果:
# 字符 A:4次
# 字符 B:3次
# 字符 D: 1次
# 字符 C:1次
# (注:不要求输出的顺序)
s = input("请输入一个字符串")
# 统计字符的个数:
# 如果第一次出现这个字符:
# 用这个字符创建字典的键,值为1
# 如果第二次或之后出现这个字符,直接将键对应的值加1
d ={}
for ch in s:
if ch not in d: #第一次出现
d[ch]=1
else:
d[ch]+=1
print(d)
for k in d:
print("字符",k,"次",d[k],"次")
字典推导式:
字典推导式是用可迭代对象依次生成字典内元素的表达式
# 语法:
# {键表达式:值表达式 for 变量 in 可迭代对象 [if真值表达式]...}
# 注:[]的内容代表可省略
# 示例:
# 生成一个字典,键为数字(10以内),值为键的平方
d = {x : x **2 for x in range(10)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
练习:
# 有如下字符串列表:k = ["tarena","xiaozhang","hello"]
# 生成如下字典:
# d = {"tarena":6,"xiaozhang":9,:"hello":5}
# 注:字典的值为键的长度
d = {k:len(k)for k in l}
print(d)
# 已知有两个字符串列表:
# Nos = [1001,1002,1005,1008]
# names = ["Tom","Jerry","Spike","Tyke"]
# 生成以Nos 中项为键,以names中的项为值的字典
# 打印下
# {1008: 'Tyke', 1001: 'Tom', 1002: 'Jerry', 1005: 'Spike'}
Nos = [1001,1002,1005,1008]
names = ["Tom","Jerry","Spike","Tyke"]
# 方法1
d = {}
for i in range(len(Nos)):
d[Nos[i]] = names[i]
print(d)
# 方法2
d = {Nos[i]:names[i] for i in range(len(Nos))}
print(d)
# 方法3
d = {}
for n in Nos:
d[n] = names[Nos.index(n)]
print(d)
# 方法4
d = {n:names[Nos.index(n)] for n in Nos}
print(d)
字典 VS 列表
1.都是可变对象
2.索引方式不同,列表用整数索引,字典用键索引
3.字典的插入,删除,修改的速度可能会快于列表(重要)
4.列表的存储是有序的,字典的存储是无序的