2.6 字典

字典

字典也可以当做是个容器,在内部可以存放数据。相比较于元组和列表,字典的元素必须是 键值对。

注意:在Python3.6+字典就是有序了,之前的字典都是无需。

1.字典定义

info = {"age":12, "status":True, "name":"wupeiqi","hobby":['篮球','足球']}
# 例如: "age":12 称为一个键值对。
department_dict = {
    "IT部门":["武沛齐","Alex"],
    "销售部":["张三","刘能","张扬"],
    "财务部":["歪歪"]
}
department_dict = {
    "武沛齐":{"id":1,"gender":"男","email":"xx@live.com"},
    "Alex":{"id":1,"gender":"男","email":"xx@live.com"},
    "郭达":{"id":1,"gender":"男","email":"xx@live.com"},
    "刘能":{"id":1,"gender":"男","email":"xx@live.com"},
    "赵四":{"id":1,"gender":"男","email":"xx@live.com"},
    "广坤":{"id":1,"gender":"男","email":"xx@live.com"},
    ...
}
注意:字典的键有特殊要求,即:必须可哈希 。 目前为止学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/dict

合法
dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帅
哥', '美⼥'], (1, 2, 3): '麻花藤'}
print(dic[123])
print(dic[True])
print(dic['id'])
print(dic['stu'])
print(dic[(1, 2, 3)])

不合法
# dic = {[1, 2, 3]: '周杰伦'} # list是不可哈希的. 不能作为key
# dic = {{1: 2}: "哈哈哈"}    # dict是不可哈希的. 不能作为key
# dic = {{1, 2, 3}: '呵呵呵'} # set是不可哈希的, 不能作为key

2.常见方法

  • keys 所有的键
info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"}
data = info.keys() # 获取字典的所有的键,返回一个`高仿的`列表,存放的都是字典中的key。
print(data) # 输出:dict_keys(['age', 'status', 'name', 'email'])
info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"}
for ele in info.keys():
 print(ele)
注意:在Python2中 字典.keys()直接获取到的是列表,而Python3中返回的是高仿列表,这个高仿的列表可以被循环显示。

  • values 所有的值
info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"}
data = info.values()
print(data) # 输出:dict_values([12, True, 'wupeiqi', 'xx@live.com'])
info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"}
for val in info.values():
 print(val) # 输出:dict_values([12, True, 'wupeiqi', 'xx@live.com'])
注意:在Python2中 字典.values()直接获取到的是列表,而Python3中返回的是高仿列表,这个高仿的列表可以被循环显示。

  • items 所有的键值
info = {"age":12, "status":True, "name":"wupeiqi","email":"xx@live.com"}
data = info.items()
print(data) # 输出 dict_items([('age', 12), ('status', True), ('name', 'wupeiqi'), ('email', 'xx@live.com')])
for item in info.items():
 print(item) # item是一个元组 (键,值)
for key,value in info.items():
 print(key,value) # key代表键,value代表值,将兼职从元组中直接拆分出来了。

  • update 更新字典键值对
info = {"age":12, "status":True}
info.update({"age":14,"name":"武沛齐"}) # info中没有的键直接添加;有的键则更新值
print(info) # 输出:{"age":14, "status":True,"name":"武沛齐"}

  • pop 移除字典的键值对
info = {"age":12, "status":True,"name":"武沛齐"}
data = info.pop("age")
print(info) # {"age":12,"name":"武沛齐"}
print(data) # 12

  • get 根据键获取值
info = {"age":12, "status":True,"name":"武沛齐"}
data = info.get("name",None) # 根据name为键去info字典中获取对应的值,如果不存在则返回None,存在则返回值。
print(data) # 输出:武沛齐

3.转换

由于字典的每一个元素是键值对,所以想要转换为字典的必须要有个特定的格式才能转换成功
v = dict([("k1","v1"),("k2","v2")])
print(v) # 输出:{'k2': 'v2', 'k1': 'v1'}
v = dict([ ["k1","v1"], ["k2","v2"] ])
print(v) # 输出:{'k2': 'v2', 'k1': 'v1'}
子元素必须包含两个元素,从而将值对应给字典的键、值。

4.其他

#取长度
  info = {"age":12, "status":True,"name":"武沛齐"}
  data = len(info)
  print(data) # 输出:3

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

  info = {"age":12, "status":True,"name":"武沛齐"}
  print(info["age"])      # 输出:12
  print(info["name"])        # 输出:武沛齐
  print(info["status"])    # 输出:True
  print(info["xxxx"])       # 报错,通过键为索引去获取之后时,键不存在会报错(以后项目开发时建议使用get方法根据键去获取值)
  提示:字典根据键的查找速度非常快,远远大于列表或元组通过索引查找的速度,因为字典内部是基于hash存储。
  根据键 修改值 和 添加值 和 删除键值对
  上述示例通过键可以找到字典中的值,通过键也可以对字典进行添加和更新操作

  info = {"age":12, "status":True,"name":"武沛齐"}
  info["gender"] = "男" # gender键在字典中不存在,则自动在字典中新添加一个键值对
  print(info) # 输出: {"age":12, "status":True,"name":"武沛齐","gender":"男"}
  info = {"age":12, "status":True,"name":"武沛齐"}
  info["age"] = "18" # age键在info字典中已存在,则更新键对应的值
  print(info) # 输出: {"age":18, "status":True,"name":"武沛齐"}
  info = {"age":12, "status":True,"name":"武沛齐"}
  del info["age"] # 删除info字典中键为age的那个键值对(键不存在则报错)
  print(info) # 输出: {"status":True,"name":"武沛齐"}

#修改(存在修改/不存在增加)
info["age"] = 19

#删除
del info['name']

#for循环
 由于字典也属于是容器,内部可以包含多个键值对,可以通过循环对其中的:键、值、键值进行循环;
 info = {"age":12, "status":True,"name":"武沛齐"}
 for item in info.key():
     print(item)
 info = {"age":12, "status":True,"name":"武沛齐"}
 for item in info.values():
     print(item)
 info = {"age":12, "status":True,"name":"武沛齐"}
 for key,value in info.items():
     print(key,value)

#字典嵌套
  截止目前位置我们已学了:int/str/list/tuple/dict 五种常见数据类型,而其中list/tuple/dict类型中可以包含子元素,所以他们的内容就可以进行数据的嵌套。但在嵌套和对内部数据操作时要注意:元组子元素不能变、不可哈希的list、dict不能做字典的键。
 dic = {
     'name':'汪峰',
     'age':48,
     'wife':[{'name':'国际章','age':38}],
     'children':['第一个熊孩子','第二个熊孩子']
 }
 """
 1. 获取汪峰的妻子名字
     d1 = dic['wife'][0]['name']
     print(d1)
 2. 获取汪峰的孩子们
     d2 = dic['children']
     print(d2)
 3. 获取汪峰的第一个孩子
     d3 = dic['children'][0]
     print(d3)
 4. 汪峰的媳妇姓名变更为 章子怡
     dic['wife'][0]['name] = "章子怡"
     print(dic)
 5. 汪峰再娶一任妻子
     dic['wife'].append({"name":"铁锤","age":19})
     print(dic)
 6. 给汪峰添加一个爱好:吹牛逼
     dic['hobby'] = "吹牛逼"
     print(dic)
 7. 删除汪峰的年龄
     del dic['age']
     或
     dic.pop('age')_
     print(dic)
 """
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注