1.简介

和列表很相似,最明显的不同就是索引不为数字,可以是字符串等。
字典是 无序键不重复 且 元素只能是键值对形式的可变的容器

特点

  • 容器
  • 元素必须键值对
  • 键不重复,重复则会被覆盖
  • 无序,无法通过索引取值,但可以通过键取值。
  • 可变,可以添加、修改和删除元素。

2.定义

定义空字典

  1. a = {} # 语法一
  2. a = dict() # 语法二

定义非空字典

  1. data = { "k1":1, "k2":2 }
  1. info = {
  2. "name": "mufeng",
  3. "age": 18,
  4. "male": True,
  5. "hobby": ['篮球', '足球']
  6. }
  1. data_dict = {
  2. "沐风": 29,
  3. True: 5,
  4. 123: 5,
  5. (11, 22, 33): ["deepwind", "ecithy"]
  6. }

字典中对键值的要求:

  • 键:必须可哈希。 目前为止学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/set/dict。
  • 值:任意类型。

3.使用场景

一般在什么情况下会用到字典呢?
当我们想要表示一组信息时,用字典可以更直观,例如:

  1. # 用户列表
  2. user_list = [("mufeng", "2"), ("ecithy", "26"), ("deepwind", "29")]
  3. # 用户列表
  4. user_list = [{"name": "mufeng", "age": "2"}, {"name": "ecithy", "age": "26"}, {"name": "deepwind", "age": "29"}]

4.操作

4.1.增

键存在不修改

  1. data = {
  2. "name": "沐风",
  3. "QQ": '598779784'
  4. }
  5. data.setdefault("age", 18)
  6. print(data) # {'name': '沐风', 'QQ': '598779784', 'age': 18}
  7. data.setdefault("name", "deepwind") # 设置不成功,因为name键已经存在
  8. print(data) # {'name': '沐风', 'QQ': '598779784', 'age': 18}

键存在修改

相比setdefault,如果键存在,update会修改值

  1. info = {"age": 18, "name": "沐风"}
  2. info.update({"age": 16, "name": "ecithy", 'gender': '男'}) # info中没有的键直接添加;有的键则更新值
  3. print(info) # {'age': 16, 'name': 'ecithy', 'gender': '男'}

等效于

  1. info = {"age": 18, "name": "沐风"}
  2. info["age"] = "16"
  3. info["name"] = "ecithy"
  4. info["gender"] = "男"
  5. print(info) # {'age': '16', 'name': 'ecithy', 'gender': '男'}

4.2.删

根据索引删除

dict.pop([i]),等效于del dict[i] 删除列表中指定键对应的元素,并返回被删除的元素。未指定键时,a.pop()触发 TypeError异常

  1. info = {"age": 12, "name": "沐风"}
  2. data = info.pop("age")
  3. print(info) # {"name":"沐风"}
  4. print(data) # 12

等效于

  1. info = {"age": 12, "name": "沐风"}
  2. del info['age']
  3. print(info) # {'name': '沐风'}

按照顺序删除(后进先出)

  1. info = {"age": 12, "QQ": '598779784', "name": "沐风"}
  2. data = info.popitem() # ("name","沐风" )
  3. print(info) # {"age":12, "QQ":598779784}
  4. print(data) # ("name","沐风")

4.3.改

  1. info = {"age": 18, "name": "沐风"}
  2. info.update({"age": 16, "name": "ecithy", 'gender': '男'}) # info中没有的键直接添加;有的键则更新值
  3. print(info) # {'age': 16, 'name': 'ecithy', 'gender': '男'}

等效于

  1. info = {"age": 18, "name": "沐风"}
  2. info["age"] = "16"
  3. info["name"] = "ecithy"
  4. info["gender"] = "男"
  5. print(info) # {'age': '16', 'name': 'ecithy', 'gender': '男'}

4.4.查

字典不同于元组和列表,字典的索引是,而列表和元组则是 0、1、2等数值

根据键获取值

  1. info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
  2. print(info["age"]) # 16
  3. print(info["name"]) # ecithy
  4. # print(info["xxx"]) # 报错,通过键为索引去获取之后时,键不存在会报错(建议使用get)
  5. value = info.get("xxx") # None
  6. value2 = info.get("xxx", 666) # 666 # 根据键获得对应的值,没有该键则得到第二个参数
  7. print(value)

所有键

  1. info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
  2. data = info.keys()
  3. print(data) # dict_keys(['age', 'name', 'gender'])
  4. result = list(data)
  5. print(result) # ['age', 'name', 'gender']

所有值

  1. info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
  2. data = info.values()
  3. print(data) # dict_values(['16', 'ecithy', '男'])
  4. result = list(data)
  5. print(result) # ['16', 'ecithy', '男']

遍历

  1. # 只得到key
  2. info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
  3. for item in info:
  4. print(item) # item得到的是字典info的key
  1. info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
  2. data = info.items()
  3. print(data) # dict_items([('age', '16'), ('name', 'ecithy'), ('gender', '男')])
  4. result = list(data)
  5. print(result) # [('age', '16'), ('name', 'ecithy'), ('gender', '男')]
  1. # 得到(key,value)
  2. for item in info.items():
  3. print(item[0], item[1]) # item是一个元组 (键,值)
  1. # 得到key,value
  2. for key, value in info.items():
  3. print(key, value) # key代表键,value代表值,将键值直接从元组中拆分出来了。

4.5.统计

字典长度

  1. info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
  2. print(len(info)) # 3

是否存在

  1. info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
  2. print('age' in info.keys()) # True
  3. print('ecithy' in info.values()) # True

4.6.类型转换

list转dict

  1. keys_list = ['age', 'name', 'gender']
  2. values_list = ['16', 'ecithy', '男']
  3. res = dict(zip(keys_list, values_list))
  4. print(res) # {'age': '16', 'name': 'ecithy', 'gender': '男'}

tuple转dict

  1. keys_list = ('age', 'name', 'gender')
  2. values_list = ('16', 'ecithy', '男')
  3. res = dict(zip(keys_list, values_list))
  4. print(res) # {'age': '16', 'name': 'ecithy', 'gender': '男'}