大家好,我是小白,书接上回,我们目前已经了解到了Python中很常见的一种数据类型:List,也初步掌握了一些Python自带的有关List的方法,今天为大家介绍另外一种异常火爆的数据结构:字典Dictionary,不夸张的讲,基本上我们熟悉了列表和字典后有关数据结构这里就差不多啦,实际的项目中应用的最多的也是这两种,至于其他的Set,Tuple平时用的不多~
字典到底是什么
简单来说,字典是另一种可变数据类型,且可存储任意类型对象。就是说字典里面存储的值我们可以修改~
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:
d = { #这里d的结构就是一个字典
<key>: <value>, #基础的数据结构就是一个key=>value
<key>: <value>,
.
.
.
<key>: <value>
}
键必须是唯一的,但值则不必。值可以取任何数据类型,我会在接下来用详细的例子详细解释。
如果我们要把字典和列表做一个对比总结的话,可以发现如下特点:
- 列表和字典的值都可以被修改
- 列表和字典都是动态结构,也就是说可以任意插入值,无限扩展
- 列表中获取值的方式是通过Index(索引)
- 字典中获取值是通过key(键)
- 列表字典都可以层次嵌套,比如一个列表中的值可以是另一个列表,
好啦,让我们现在开始今天的栗子吧~
Dictionary字典常用方法(内含扎心举例):
创建一个字典
首先,不知道有没有小白朋友们感到疑惑,既然已经有列表了,为啥还需要字典这种数据结构 ?原因很简单哈哈,出于实际需要,我来举个令人伤心的例子说明:
你是北京知名985,211毕业的北漂有为青年xiaobai,躲过了这轮互联网寒冬,23岁的你每天最爱穿着格子衫去街角咖啡厅点一杯可以无限续杯的伯爵红茶,顺便打量着周围45度仰脸拍抖音的小姐姐,意淫着一些不可告人的事情,这时来了一个青春无比的妹子,交谈甚欢后,同为北漂的她得知你技术入股进入一家创业公司,以及老板忽悠你的超级大饼和期权,内心狂喜,碰到潜力股了呀,程序猿呀,技术入股呀 !而你以多年老司机经验用余光扫描了妹子的三围,得出结论大概是82,62,82后,立刻邀请她去厕所做了一些羞羞的事情( 此处省略 6秒 ),几个月后迅速结婚然后生了一个丑萌的孩子...
好啦,请你把这段经历用列表来表示一下 ? WTF! 答案几乎不可能,但是用字典的话某种程度上会解释的清楚一些~ 哈哈
如果用列表,就只能这么表示:
young_man = ['xiaobai',985,23,'Developper'.......]
完全不懂在说啥呀...但是如果用字典会舒服的多:
young_man = {'first_name':'bai',
'family_name':'xiao',
'age':23,
'city':'Beijing',
'university_rank':'985',
'university_name':'beida',
'job':'Developer',
'salary':20000.00,
'company':'Start Up',
'married':True,
'wife_measurements':[82,62,82],
'number_of_children':1,
'future':None
}
瞬间感觉信息量暴涨有木有 ! 其实当我最开始接触字典的时候,我对它的第一感觉是经过select语句从数据库查询出的一个结果哈哈~, 好啦,让我们查看一下我们创建的这个字典:
print(young_man)
Out: {'first_name': 'bai',
'family_name': 'xiao',
'age': 23,
'city': 'Beijing',
'university_rank': '985',
'university_name': 'beida',
'job': 'Developer',
'salary': 20000.00,
'company': 'Start Up',
'married': True,
'wife_measurements': [82, 62, 82],
'number_of_children': 1,
'future': None}
大家可以发现输出的格式和创建的格式基本一样,都是符合上面我们提到过的key=>value 的形式,这里我们创建了一个字典并把字典的值赋给变量young_man,几点需要大家注意:
- 字典的键是唯一的,类型也可以为int,我这个例子都是str类型,但是基本int类型的极少
- 在'university_name':'985' 这组信息中985是字符型,但是底下"number_of_children"的值为1,1是int型
- 字典的值可以是一个列表或者另一个列表,比如这里'wife_measurements’是指xiaobai老婆的三围,那可以传递一个包含三个值的列表,这也是我们上面说到过的列表字典都可以相互嵌套
- 字典的值可以是任意类型,比如这里的"future":None, 因为,因为你没有未来啊,啊哈哈
访问字典里的值
现在我们已经成功创建了一个字典,那么如何获取字典中的值呢?我们知道在List中可以通过切片[start_index:end_index]来获取,字典里提供了另一种形式:
dict[name_of_key] #把相应的键放入到方括号中
现在让我们获得xiaobai的姓和工资:
print("The first name of young man is :", young_man['first_name'])
print("Salary of young man:",young_man['salary'])
Out: The first name of young man is: bai
Salary of young man: 20000.00
很简单吧,如果是xiaobai老婆的三围呢?
print(young_man['wife_measurements'])
Out:[82, 62, 82]
如果就对胸围感兴趣呢? 因为'wife_measurements'这个键对应的值为一个列表,我们可以接着使用列表获取值的方法:
print('The Bust measure is',young_man['wife_measurements'][0],'cm')
Out: The Bust measure is 82 cm
如果对所有的值都感兴趣呢?那很简单,字典提供了一个非常简单的方法values():
print(young_man.values())
Out:dict_values(['bai', 'xiao', 23, 'Beijing', '985', 'beida', 'Developer', 10000, 'Start Up', True, [82, 62, 82], 1, None])
这样我们就获得young_man里面所有的值了
访问字典里的键
不用多解释,很简单,也是一个自带的方法.keys():
print(young_man.keys())
Out: dict_keys(['first_name', 'family_name', 'age', 'city', 'university_rank', 'university_name', 'job', 'salary', 'company', 'married', 'wife_measurements', 'number_of_children', 'future'])
访问字典里的键和值
经过上面的介绍,我们可以分别获得字典的值和键,现在我们要把他们融合一下,其实很简单,因为本身字典可以迭代:
for k,v in young_man.items():
print(k,":",v)
Out:first_name : bai
family_name : xiao
age : 23
city : Beijing
university_rank : 985
university_name : beida
job : Developer
salary : 10000
company : Start Up
married : True
wife_measurements : [82, 62, 82]
number_of_children : 1
future : None
字典里有一个方法:.items(),说白了就是获取到当前的键和值,这里我们用一个for循环可以迭代这个字典,分别输出键和值,这里注意一下,k,v是什么不重要,大家可以把k,v换成其他的字母都是没有问题的,有关字典的很多实用技巧我们下一期会讲。
添加,修改字典里的值
结婚1年后的你攒了10万块,加上6个钱包的100万在北京付了首付,买来了小两居,然而丑萌的孩子,漂亮的老婆,加上房子的月供让你不堪重负,好在经过你的努力,现在的工资已经涨到了3万,变成了传说中的产品经理,身旁电视里响起共克时艰的号召,看似美好的生活向你招手,但坏消息突然接踵而至,首先第二个孩子的出生让你的经济状况雪上加霜,你在感叹杜蕾斯的产品质量同时突然发现事情有些不对......
你忽然回忆起很多细节,最近几个月赶项目,经常在深夜回家时发现一辆扎眼的保时捷正开出小区,到家时妻子经常满面潮红的刚刚洗完澡出现在你面前, 你经常关注着中兴老员工跳楼,xxx创业失败煤气自杀等负面新闻,却忽略了妻子钱包多出来的各种美容健身购物酒店卡....
眼前冒绿星的你心中一凉,拿起土著的照片看了看,又看看自己怀里新出生的老二,眉宇间竟有几分相似,脑袋嗡的一声后决定要去做亲子鉴定...
首先先让我们看看如何在字典里新加一个值,让我们把xiaobai的银行存款和买加进去:
young_man['bank_account']=100000
young_man['Own_house']=True
其实很简单啦,只要把ke和value按照图中形式添加就好了,这个时候我们再看young_man这个字典就会发现已经多了两个值:
{'first_name': 'bai', 'family_name': 'xiao', 'age': 23, 'city': 'Beijing', 'university_rank': '985', 'university_name': 'beida', 'job': 'Developer', 'salary': 20000.0, 'company': 'Start Up', 'married': True, 'wife_measurements': [82, 62, 82], 'number_of_children': 1, 'future': None, 'bank_account': 100000, 'Own_house': True}
其次,xiaobai的职业,薪水,和孩子的数量有了变化,此时需要对字典中对应的值进行修改,这里十分简单:
young_man['age']+=1
young_man['job'] = 'Product Manager'
young_man['salary']=30000.00
young_man['number_of_children']=2
再看一下现在的young_man:
{'first_name': 'bai', 'family_name': 'xiao', 'age': 24, 'city': 'Beijing', 'university_rank': '985', 'university_name': 'beida', 'job': 'Product Manager', 'salary': 30000.0, 'company': 'Start Up', 'married': True, 'wife_measurements': [82, 62, 82], 'number_of_children': 2, 'future': None, 'bank_account': 100000, 'Own_house': True}
此外如果修改多个值,用update()是最方便的,我们下一篇笔记会说~
删除字典里的值
医院的结果出来了,不出意料,杜蕾斯质量没问题,你迅速回到家中准备兴师问罪,却发现妻子早已准备好了离婚协议,在暴怒之中的你想也没想就选择了净身出户,把所有的一切都留给了妻子,自己没日没夜地工作期待有一天公司上市自己套现离场,继续开始人生下半场,然而一切都是命中注定,不知怎么,你也成为了《就算老公一毛钱股份都没拿到,在我心里,他依然是最牛逼的创业者》里的主角,命运向你展示了它狰狞的一面,你最后的希望随之破灭,终日借酒浇愁。
在一个百无聊赖的晚上,你带着仅有的几千块钱做了一次高级大保健,负责给你服务的小姐姐名叫skyler,来自美国新墨西哥州的Albuquerque市,人生失意的你唱着崔健的<<一无所有>>和她倾诉了自己的前半生,笑靥如花的小姐姐安慰了你,向你描述了美利坚大地上美好的一切和自己同样悲惨的前半生,同时天涯沦落人,相逢何必曾相识!
伴随着大保健配套的bgm《沙漠骆驼》,醉眼朦胧的你仿佛看到了遥远的Albuquerque市,便宜的大别墅和skyler的笑脸,一切尽在咫尺,却又遥不可及。。。
回到正题,这里xiaobai选择净身出户,因此很多属于他的东西全部没了,删除字典中的值很简单,只需要del关键字:
这里删除的东西有点多,我利用了上篇笔记讲过的知识,首先建立了一个列表,装入young_man的想要删除的键值,然后利用迭代一次删除,这并不是一个优雅的方法,但是目的是让大家看一下列表和字典的一个结合操作,现在再看一下young_man:
{'first_name': 'bai',
'family_name': 'xiao',
'age': 24,
'city': 'Beijing',
'university_rank': '985',
'university_name': 'beida',
'future': None}
这个时候如果我们还想看看银行存款是不可能的了,如果我们尝试老方法:
young_man['bank_account'] # ERROR
会很容易的报错,因为在字典中已经没有这个值了,为了避免报错,我推荐大家使用get方法:
print(young_man.get('bank_account','Not Found')) # 如果没有输出Not Found
Out: Not Found
创建字典的其他方式*
还未到30的你做出了一个人生中最重要的决定,那就是和skyler一起去她的老家Albuquerque市,从零开始
你用你仅存的化学知识在当地的高中谋取到了一个化学老师的工作,利用自己姓名xiaobai起了一个地道的美国名字:Walter White, 小城市的生活悠闲惬意,当地的炸鸡店“Los Pollos Hermanos”味美绝伦,你和skyler也有了爱的结晶,又一个丑萌而且先天残疾的孩子出生了。。
此时的xiaobai已经有了全新的身份,这里我们换一种方式创建他的全新个人信息:
walter_white_keys = ['name','age','job','subject','adress','wife']
walter_white_values = ['Walter White',50,'Teacher','Chemistry','Albuquerque','Skyler']
Breaking_Bad = dict(zip(walter_white_keys,walter_white_values))
查看一下全新的老白:
print(Breaking_Bad)
{'name': 'Walter White',
'age': 50,
'job': 'Teacher',
'subject': 'Chemistry',
'adress': 'Albuquerque',
'wife': 'Skyler'}
清空字典*
你也会时常想起国内抛下的孩子,感慨天道有轮回,善恶到头终有报,20年如白驹过隙, 稍纵即逝,此刻你已年近50,知天命的年龄被诊断出了癌症,正当你觉得人生无望的时候,一个曾经教过的小混混学生Jesse Pinkman出现在你的面前,从此江湖上开始了你的传说。。。
故事的最后,你看着腹部缓缓流出的鲜血,没有理会,依然专注地在制作眼前令无数人痴迷的蓝色结晶物,直到体力不支缓缓倒地,在生命的最后时刻,伴随着耳边的《Baby Blue》,眼前依稀看到了30年的那个意气风发的少年坐在街边咖啡馆,正专注地学习Python,直到一个女孩款款向他走来。。。。。。
至此,一代枭雄终落幕,最后让我们忍住眼泪,敲下最后的代码:
Breaking_Bad.clear()
del Breaking_Bad
我想可能有一句话能概括最后时刻老白的内心想法:我爱你不后悔,也尊重故事的结尾
如果你也是老白的粉丝,那就扩散吧,完结,撒花~