数据类型-字典

字典的初识

  • why列表可以存储大量的数据,数据之间的关联性不强 #['taibai',18,'nan','dazhuang',3,'nv'] #列表的查询速度比较慢
  • what:容器型数据类型:dict

  • how:

    • 数据类型的分类(可变与不可变):

      • #01 可变(不可哈希)的数据类型:list dict set

      • #02 不可变(可哈希)的数据类型:str,int(常用) tuple.bool

    • 字典:{}括起来,以键值对存储的数据类型

    • 键必须是不可变的数据类型,而且是唯一的

    • 值可以是任意数据类型,对象

    • 字典在3.5版本之前(包括3.5)是无序的

    • 字典在3.6.x会按照初次建立字典的顺序排列,学术上不认为是有序的

    • 字典的优点:查询速度快,存储关联性的数据

      • 字典的查询速度非常快,简单解释一下原因:字典的键值对会存在一个散列表(稀疏数组)这样的空间中,每一个单位称作一个表元,表元里面记录着key:value,如果你想要找到这个key对应的值,先要对这个key进行hash获取一串数字咱们简称为门牌号(非内存地址),然后通过门牌号,确定表元,对比查询的key与被锁定的key是否相同,如果相同,将值返回,如果不同,报错。(这里只是简单的说一下过程,其实还是比较复杂的。)

    • 字典的缺点:以空间换时间

  • 字典的使用

    字典的创建方式

    #方式一:元组的拆包
    dic = dict((('one',1),('two',2),('three',3)))
    print(dic)  #{'three': 3, 'one': 1, 'two': 2}
    
    #方式二:
    dic = dict(one=1,two=2,three=3)
    print(dic)
    
    #方式三:官方写法
    dic = dict({'one':1,'two':2,'three':3})
    print(dic)
    
    #验证字典的合法性:
    dic = {[1,2,3]:'alex',1:666}
    print(dic)
    #TypeError: unhashable type: 'list'

    字典的增删改查

  增

 

1 dic = {'name':'taibai','age':18}
2 # dic['sex'] = 'nan'
3 # dic['age'] = 23 #直接增加,有则改之,无则新增
4 # print(dic) #{'name': 'taibai', 'age': 23, 'sex': 'nan'}
5 
6 dic.setdefault('hobby',['basketball','xiaqi','zhinan']) #有则不变,无则新增
7 # dic.setdefault('age',23) #{'name': 'taibai', 'hobby': 'basketball', 'age': 18}
8 # print(dic) #{'sex': 'nan', 'name': 'taibai', 'hobby': 'basketball', 'age': 23}

 

  删 pop clear del

 1 #pop 按照键删除键值对
 2 # ret = dic.pop('age')
 3 # print(ret) #18
 4 # #若删除键不存在,则返回提示
 5 # ret = dic.pop('sex','没有此键')
 6 # print(ret) #没有此键
 7 
 8 # clear
 9 # dic.clear()
10 # print(dic) #{}
11 
12 
13 #del
14 del dic['age']
15 print(dic) #{'name': 'taibai', 'hobby': 'basketball'}

  改

1 dic['name'] = 'alex'
2 print(dic) #{'name': 'alex', 'hobby': 'basketball'}

  查

print(dic['hobby']) #不建议用此方法
ret = dic.get('hobby')
print(ret)
ret2 = dic.get('hobby1','查无此人')
print(ret2)

#keys(),values()

print(dic.keys(),dic.values(),list(dic.keys()))

for key in dic:
print(dic[key])

for key in dic.keys():
print(dic[key])

for value in dic.values():
print(value)

#items
for i in dic.items():
print(i,type(i)) #('hobby', ['basketball', 'xiaqi', 'zhinan']) <class 'tuple'>

for a,b in dic.items():
print(a,b,type(a)) #name alex <class 'str'> hobby ['basketball', 'xiaqi', 'zhinan'] <class 'str'>

字典的嵌套

 1 #字典嵌套列表
 2 #练习一
 3 dic = {
 4     'name':'wangfeng',
 5     'age':48,
 6     'wife':[{'name':'zhangziyi','age':38}],
 7     'children':{'girl_first':'xiaoping','girl_second':'xiaoyi','girl_three':'xingxing'}
 8 }
 9 
10 #1.输出wangfeng
11 print(dic.get('name'))
12 #2.输出wife键对应的值
13 print(dic.get('wife'))
14 #3.输出zhagnziyi
15 print(dic.get('wife')[0].get('name'))
16 #4.输出第三个女儿的名字
17 print(dic.get('children').get('girl_three'))
18 
19 #练习二
20 dic1 ={
21     'name':['alex',2,3,5],
22     'job':'teacher',
23     'class':{'alex':['python','python2',100]}
24 }
25 
26 dic1['name'].append('wusir')
27 print(dic1) #{'job': 'teacher', 'name': ['alex', 2, 3, 5, 'wusir'], 'class': {'alex': ['python', 'python2', 100]}}
28 dic1['name'][0] = dic1['name'][0].capitalize()
29 print(dic1)
30 dic1['class']['lnh'] = 'linux'
31 print(dic1)
32 dic1['class']['alex'].pop(1)
33 print(dic1)

#练习三
将字符串 'k:1|K1:2|k2:3|K3:4' 转换为字典 {'K1': 2, 'K3': 4, 'k': 1, 'k2': 3}
msg = 'k:1|K1:2|k2:3|K3:4'

dic = {}
msg_list = msg.strip().split('|')
for i in msg_list:
key,value = i.split(':')
dic[key] = int(value)

print(dic) # {'K1': 2, 'K3': 4, 'k': 1, 'k2': 3}

 

 

posted @ 2020-03-15 22:35  贰佰  阅读(287)  评论(0编辑  收藏  举报