1.简介
和列表很相似,最明显的不同就是索引不为数字,可以是字符串等。
字典是 无序、键不重复 且 元素只能是键值对形式的可变的容器。
特点
- 容器
- 元素必须键值对
- 键不重复,重复则会被覆盖
- 无序,无法通过索引取值,但可以通过键取值。
- 可变,可以添加、修改和删除元素。
2.定义
定义空字典
a = {} # 语法一
a = dict() # 语法二
定义非空字典
data = { "k1":1, "k2":2 }
info = {
"name": "mufeng",
"age": 18,
"male": True,
"hobby": ['篮球', '足球']
}
data_dict = {
"沐风": 29,
True: 5,
123: 5,
(11, 22, 33): ["deepwind", "ecithy"]
}
字典中对键值的要求:
- 键:必须可哈希。 目前为止学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/set/dict。
- 值:任意类型。
3.使用场景
一般在什么情况下会用到字典呢?
当我们想要表示一组信息时,用字典可以更直观,例如:
# 用户列表
user_list = [("mufeng", "2"), ("ecithy", "26"), ("deepwind", "29")]
# 用户列表
user_list = [{"name": "mufeng", "age": "2"}, {"name": "ecithy", "age": "26"}, {"name": "deepwind", "age": "29"}]
4.操作
4.1.增
键存在不修改
data = {
"name": "沐风",
"QQ": '598779784'
}
data.setdefault("age", 18)
print(data) # {'name': '沐风', 'QQ': '598779784', 'age': 18}
data.setdefault("name", "deepwind") # 设置不成功,因为name键已经存在
print(data) # {'name': '沐风', 'QQ': '598779784', 'age': 18}
键存在修改
相比setdefault,如果键存在,update会修改值
info = {"age": 18, "name": "沐风"}
info.update({"age": 16, "name": "ecithy", 'gender': '男'}) # info中没有的键直接添加;有的键则更新值
print(info) # {'age': 16, 'name': 'ecithy', 'gender': '男'}
等效于
info = {"age": 18, "name": "沐风"}
info["age"] = "16"
info["name"] = "ecithy"
info["gender"] = "男"
print(info) # {'age': '16', 'name': 'ecithy', 'gender': '男'}
4.2.删
根据索引删除
dict.pop([i])
,等效于del dict[i]
删除列表中指定键对应的元素,并返回被删除的元素。未指定键时,a.pop()触发 TypeError异常
info = {"age": 12, "name": "沐风"}
data = info.pop("age")
print(info) # {"name":"沐风"}
print(data) # 12
等效于
info = {"age": 12, "name": "沐风"}
del info['age']
print(info) # {'name': '沐风'}
按照顺序删除(后进先出)
info = {"age": 12, "QQ": '598779784', "name": "沐风"}
data = info.popitem() # ("name","沐风" )
print(info) # {"age":12, "QQ":598779784}
print(data) # ("name","沐风")
4.3.改
info = {"age": 18, "name": "沐风"}
info.update({"age": 16, "name": "ecithy", 'gender': '男'}) # info中没有的键直接添加;有的键则更新值
print(info) # {'age': 16, 'name': 'ecithy', 'gender': '男'}
等效于
info = {"age": 18, "name": "沐风"}
info["age"] = "16"
info["name"] = "ecithy"
info["gender"] = "男"
print(info) # {'age': '16', 'name': 'ecithy', 'gender': '男'}
4.4.查
字典不同于元组和列表,字典的索引是键
,而列表和元组则是 0、1、2等数值
。
根据键获取值
info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
print(info["age"]) # 16
print(info["name"]) # ecithy
# print(info["xxx"]) # 报错,通过键为索引去获取之后时,键不存在会报错(建议使用get)
value = info.get("xxx") # None
value2 = info.get("xxx", 666) # 666 # 根据键获得对应的值,没有该键则得到第二个参数
print(value)
所有键
info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
data = info.keys()
print(data) # dict_keys(['age', 'name', 'gender'])
result = list(data)
print(result) # ['age', 'name', 'gender']
所有值
info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
data = info.values()
print(data) # dict_values(['16', 'ecithy', '男'])
result = list(data)
print(result) # ['16', 'ecithy', '男']
遍历
# 只得到key
info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
for item in info:
print(item) # item得到的是字典info的key
info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
data = info.items()
print(data) # dict_items([('age', '16'), ('name', 'ecithy'), ('gender', '男')])
result = list(data)
print(result) # [('age', '16'), ('name', 'ecithy'), ('gender', '男')]
# 得到(key,value)
for item in info.items():
print(item[0], item[1]) # item是一个元组 (键,值)
# 得到key,value
for key, value in info.items():
print(key, value) # key代表键,value代表值,将键值直接从元组中拆分出来了。
4.5.统计
字典长度
info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
print(len(info)) # 3
是否存在
info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
print('age' in info.keys()) # True
print('ecithy' in info.values()) # True
4.6.类型转换
list转dict
keys_list = ['age', 'name', 'gender']
values_list = ['16', 'ecithy', '男']
res = dict(zip(keys_list, values_list))
print(res) # {'age': '16', 'name': 'ecithy', 'gender': '男'}
tuple转dict
keys_list = ('age', 'name', 'gender')
values_list = ('16', 'ecithy', '男')
res = dict(zip(keys_list, values_list))
print(res) # {'age': '16', 'name': 'ecithy', 'gender': '男'}