Python 基础第七讲:怎么理解字典呢?

共 9032字,需浏览 19分钟

 ·

2021-04-01 00:07

4.5.1 什么是字典

字典是另外一个可变的数据结构,且可存储任意类型对象,比如字符串、数字、列表等。字典是由关键字和值两部分组成,也就是 key 和 value,中间用冒号分隔。这种结构类似于新华字典,字典中每一个字都有一个对应的解释,具体语法如下:

语法:

字典名 = { 关键字1:值,关键字2:值,关键字3:值}

每个键与值用冒号隔开(:),每对用逗号分割,整体放在花括号中({})。

键必须独一无二,但值则不必。可以有任意多个键值对

值可以取任何数据类型,但键必须是不可变的,如字符串,数或元组。

例子:

#构建一个字典,记录各宫嫔妃的年薪银子

name_dictionary = {'魏璎珞':300,'皇后':1000,'皇贵妃':800,'贵妃':600,'':200}

print(name_dictionary)

print('字典的数据类型表示是:',type(name_dictionary))

 

{'魏璎珞': 300, '皇后': 1000, '皇贵妃': 800, '贵妃': 600, '': 200}

字典的数据类型表示是: <class 'dict'>

4.5.2 字典特性

字典值可以没有限制地取任何python对象,既可以是标准的对象,也可以是用户定义的,但键不行。两个重要的点需要记住:

1.不允许同一个键出现两次:创建时如果同一个键被赋值两次,后一个值会被记住。

例子

# 定义两个同样的关键字Namedict = {'Name': 'Python', 'Age': 7, 'Name': 'Java'}print("dict['Name']: ", dict['Name'])

 

dict['Name']:  ManniJava

 

2. 键必须不可变:所以可以用数,字符串或元组充当,所以用列表就不行

例子

# 关键字Name为列表dict = {['Name']:'Python', 'Age': 7};print ("dict['Name']: ", dict['Name'])

 

File "/Users/yoni.ma/PycharmProjects/seven_days_python/Forth_day_strcure/dict_p.py", line 22, in <module>

dict['Name']:  Java

    dict = {['Name']:'Python', 'Age': 7};

TypeError: unhashable type: 'list'

4.5.3 字典的基本操作

字典在python中的类型表示是  <class 'dict'>。当查看到变量的类型是dict,则可以对其进行字典的操作。常见的字典操作是访问字典、遍历字典等。这些操作在实际项目中经常被使用到,比如excel文件读入内存以后,按照字典的方法存放。然后对其增加或删除值。

1.访问字典

访问字典也就是获取关键字对应的值,方法是指定字典名和放在方括号内的关键字,具体如下。获取后的值可以赋值给变量。

语法:

变量名 = 字典名[关键字]

例子

# 访问字典

weiyingluo = name_dictionary['魏璎珞']

print(f'魏璎珞的年薪是:{weiyingluo}')

 

魏璎珞的年薪是:300

 

2.添加键值对

字典是一种可变的数据结构,可以随时添加或者删除其中的键值对。其中添加键值的方法是,指定字典名、用方括号括起的键和相关的值,具体如下。

语法:

字典名[关键字名] =

例子

# 增加贵人和常在的年薪银子

print(f'原来的后宫年薪字典是:{name_dictionary}')

name_dictionary['贵人'] = 100

name_dictionary['常在'] = 50

print(F'增加键值后的后宫年薪字典变成:{name_dictionary}')

 

原来的后宫年薪字典是:{'魏璎珞': 300, '皇后': 1000, '皇贵妃': 800, '贵妃': 600, '': 200}

增加键值后的后宫年薪字典变成:{'魏璎珞': 300, '皇后': 1000, '皇贵妃': 800, '贵妃': 600, '': 200, '贵人': 100, '常在': 50}

 

3.修改键值对

如果字典中的值不是我们想要的,可以通过修改的方法达到。以此指定字典名、用方括号括起的键以及与该键相对应的新值。

语法:

字典名[关键字名] = 新的值

例子

# 修改字典的值,比如修改常在的年薪为70

print('常在原来的年薪是{} '.format(name_dictionary['常在']))

name_dictionary['常在']= 70

change_changzai = name_dictionary['常在']

print(f'常在修改后的年薪是{change_changzai} ')

 

常在原来的年薪是50

常在修改后的年薪是70

 

4删除键值对

如果字典中的键值对不再需要,我们可以彻底删除。Python使用的是del语句,必须要指定要删除的字典名和关键字。注意是永久删除

语法:

del 字典名[关键字]

例子

#删除字典中的键值对,比如删除常在

del name_dictionary['常在']

print(f'删除常在后的后宫嫔妃年薪字典变成:{name_dictionary}')

 

删除常在后的后宫嫔妃年薪字典变成:{'魏璎珞': 300, '皇后': 1000, '皇贵妃': 800, '贵妃': 600, '': 200, '贵人': 100}

 

如果我们还需要用到被删除的键值对,则我们使用pop(‘键的名字’)方法。该方法是删除字典给定键所对应的值,并且返回该值。

print('原来的字典是:', name_dictionary)# 使用pop方法删除魏璎珞name_pop = name_dictionary.pop('魏璎珞')# 使用删除后的值print('魏璎珞的年薪是:',name_pop)print('使用pop方法删除后的字典是:',name_dictionary)

 

原来的字典是: {'魏璎珞': 300, '皇后': 1000, '皇贵妃': 800, '贵妃': 600, '': 200, '贵人': 100}

魏璎珞的年薪是: 300

使用pop方法删除后的字典是: {'皇后': 1000, '皇贵妃': 800, '贵妃': 600, '': 200, '贵人': 100}

 

 

除了pop()方法以外, Python中还有一个popitem()方法。它可以随机删除字典中的一对(一般删除末尾一对),并且可以被后续的程序使用。我们经常用此方法逐个删除字典中的所有键值对。

# 随机删除字典中的一对pop_name = name_dictionary.popitem()print('使用popitem删除的是:',pop_name)print('随机删除字典中一对键值对后:',name_dictionary)pop2_name = name_dictionary.popitem()print('再次使用popitem删除的是:',pop2_name)print('再次随机删除字典中一对键值对后:',name_dictionary)

 

使用popitem删除的是:('贵人', 100)

随机删除字典中一对键值对后: {'皇后': 1000, '皇贵妃': 800, '贵妃': 600, '': 200}

再次使用popitem删除的是: ('', 200)

再次随机删除字典中一对键值对后: {'皇后': 1000, '皇贵妃': 800, '贵妃': 600}

 

 

如果需要删除所有的键值对,我们可以使用clear()方法清空所有的数据。但是需要注意del语句是删除字典,此时打印删除后的字典则出错。两者是有区别的。

# clear()方法清除字典中的所有数据print('原来字典的长度是:',len(name_dictionary))name_dictionary.clear()print('使用clear清除字典中的所有内容:',name_dictionary)print('清空以后字典的长度是:',len(name_dictionary))# 使用del删除字典del name_dictionary# 字典已经被删除,则再次打印则出错:name 'name_dictionary' is not definedprint(name_dictionary)

 

原来字典的长度是: 3

使用clear清除字典中的所有内容: {}

清空以后字典的长度是: 0

Traceback (most recent call last):

  File "/Users/seven_days_python/Forth_day_strcure/dict_p.py", line 139, in <module>

    print(name_dictionary)

NameError: name 'name_dictionary' is not defined

5.创建空字典

在实际项目中,我们可能不知道字典中存放的内容是什么。这时,我们可以采用从空的字典开始动态创建,也就是在程序运行的时候添加具体的内容。

常见的使用场景是:第一个:需要用户输入数据存储为字典;第二个是自动生成大量的键值对,比如爬虫,爬取豆瓣电影的排名信息。我们可以把排名放入空的字典中,然后每次爬取一个电影,添加一个对应的键值对。

例子

# 从空的字典开始创建

douban_movies = {} #定义空的字典

douban_movies['排名'] = 1

douban_movies['片名'] = '霸王别姬'

douban_movies['主演'] = '张国荣、张丰毅、巩俐'

douban_movies['导演'] = '陈凯歌'

print('从空的列表中构建字典:',douban_movies)

 

从空的列表中构建字典: {'排名': 1, '片名': '霸王别姬', '主演': '张国荣、张丰毅、巩俐', '导演': '陈凯歌'}

 

4.5.4 内置字典函数与方法

Python字典包含了很多内置函数和方法,部分如下所示。这些函数或者方法不需要死记硬背,用到的时候去网络或书中查找即可

内置函数

cmp(dict1, dict2)      #比较两个字典元素。

len(dict)              #计算字典元素个数,即键的总数。

str(dict)              #输出字典可打印的字符串表示。

 

内置方法

字典名.clear()    # 删除字典内所有元素

字典名.copy()    # 返回一个字典的浅复制

字典名.fromkeys()    # 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值

字典名.get(key, default=None)    # 返回指定键的值,如果值不在字典中返回default

字典名.items()    # 以列表返回可遍历的(, ) 元组数组

字典名.keys()    # 以列表返回一个字典所有的键

字典名.setdefault(key, default=None)    # get()类似, 但如果键不已经存在于字典中,将会添加键并将值设为default

字典名.update(dict2)    # 把字典dict2的键/值对更新到dict

字典名.values()    # 以列表返回字典中的所有值

 

例子

# 内置函数和方法

print('计算字典的个数:',len(name_dictionary))

print('输出字典可以打印的字符串',str(name_dictionary))

# 内置函数

print('返回指定的贵妃的年薪',name_dictionary.get('贵妃'))

print('以列表的形式返回字典中的所有关键字,',name_dictionary.keys()) #经常被用到

print('以元组形式返回所有的键值对',name_dictionary.items()) #经常被用到

print('返回键值中的所有值',name_dictionary.values())#经常被用到

 

计算字典的个数: 6

输出字典可以打印的字符串 {'魏璎珞': 300, '皇后': 1000, '皇贵妃': 800, '贵妃': 600, '': 200, '贵人': 100}

返回指定的贵妃的年薪 600

以列表的形式返回字典中的所有关键字, dict_keys(['魏璎珞', '皇后', '皇贵妃', '贵妃', '', '贵人'])

以元组形式返回所有的键值对 dict_items([('魏璎珞', 300), ('皇后', 1000), ('皇贵妃', 800), ('贵妃', 600), ('', 200), ('贵人', 100)])

返回键值中的所有值 dict_values([300, 1000, 800, 600, 200, 100])

 

在所有内置方法中,update()方法经常被用来合并两个字典。如果传给update方法的数据也含有相同的键,则它的值将被覆盖。

new_dictionary = {'皇后': 1000, '皇贵妃': 800, '贵妃': 600}print('第一个字典:',new_dictionary)name = {'魏璎珞': 300, '贵人': 100}print('第二个字典:',name)# 使用update方法合并两个字典new_dictionary.update(name)print('使用update方法合并两个字典:', new_dictionary)# 如果有重复的值则替换name_new = {'皇后':1500, '贵人':110}# 使用update方法合并两个字典new_dictionary.update(name_new)print('使用update方法合并两个字典:', new_dictionary)

 

第一个字典: {'皇后': 1000, '皇贵妃': 800, '贵妃': 600}

第二个字典: {'魏璎珞': 300, '贵人': 100}

使用update方法合并两个字典: {'皇后': 1000, '皇贵妃': 800, '贵妃': 600, '魏璎珞': 300, '贵人': 100}

使用update方法合并两个字典: {'皇后': 1500, '皇贵妃': 800, '贵妃': 600, '魏璎珞': 300, '贵人': 110}

4.6  结合字典与列表

字典和列表是python中经常用到的两个数据结构,并且都是可变的。有时候,我们需要把两者结合起来使用。把一系列字典存储在列表中,或将列表作为值放在字典中,这称为嵌套。你可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典。这在项目中经常用到。

什么时候用列表什么时候用字典呢?面对这个问题笔者的想法是,当你存取的数据类型都是一样的时候,使用列表,当你存取的数据类型不一样时就用字典。这里说明一下数据类型不一样不是指整形或者字符型。举个例子:如果你需要存很多人的姓名,仅仅这一个属性,就用列表来进行处理,当你要存取不仅仅是人名,包括年龄,性别,国籍等等这些信息时,这时候用字典是最合适的。

 

4.6.1 字典列表

列表中的元素都是字典为字典列表。一般用在列表的元素信息比较复杂,单一的字符串不能满足。

例子

# 两个字典合并为一个列表dict_1 = {'name':'Python','age':18}dict_2 = {'name':'Java', 'age':'unknown'}name_list = [dict_1,dict_2]print(name_list)print('类型是:',type(name_list))

 

 [{'name': 'Python', 'age': 18}, {'name': 'Java', 'age': 'unknown'}]

类型是: <class 'list'>

4.6.2 在字典中存储列表

字典中的值有时候不是一个,而是多个。这时需要把字典中的值变成一个列表,而不是单个的值。

例子

# 字典中存储列表

favorite_actor = {

    '魏璎珞':['傅恒','皇上','富察皇后'],

    '皇上':['魏璎珞','富察皇后','纯妃','高贵妃'],

    '高贵妃':'皇上'

}

print(favorite_actor)

print('类型是',type(favorite_actor))

 

 

结果为:

{'魏璎珞': ['傅恒', '皇上', '富察皇后'], '皇上': ['魏璎珞', '富察皇后', '纯妃', '高贵妃'], '高贵妃': '皇上'}

类型是 <class 'dict'>

 

4.6.3 在字典中存储字典

字典的值也可以是字典,称为字典中存储字典。一般用在键对应的值是二维的信息,比如登录某一个网站的用户信息,用户名是键,用户名对应的值比较部分,既包括用户的地址、职业、收入等信息。

例子

# 字典中存储字典

users = {

    '爱上不该爱的人': {

            '姓名':'魏璎珞',

            '职位':"妃子",

            '年薪':'300',},

 

    '只爱皇上':{

            '姓名':'高贵妃',

            '职位':'贵妃',

            '年薪':'800',}

}

print(users)

print('类型是',type(users))

 

 

{'爱上不该爱的人': {'姓名': '魏璎珞', '职位': '妃子', '年薪': '300'}, '只爱皇上': {'姓名': '高贵妃', '职位': '贵妃', '年薪': '800'}}

 

类型是 <class 'dict'>


以上内容摘自《零基础轻松学 Python》


零基础学 Python,看下嘛


 只需7天时间,跨进Python编程大门,已有3800+加入

【基础】0基础入门python,24小时有人快速解答问题;
【提高】40多个项目实战,老手可以从真实场景中学习python;
【直播】不定期直播项目案例讲解,手把手教你如何分析项目;
【分享】优质python学习资料分享,让你在最短时间获得有价值的学习资源;圈友优质资料或学习分享,会不时给予赞赏支持,希望每个优质圈友既能赚回加入费用,也能快速成长,并享受分享与帮助他人的乐趣。
【人脉】收获一群志同道合的朋友,并且都是python从业者
【价格】本着布道思想,只需 69元 加入一个能保证学习效果的良心圈子。

【赠予】价值109元 0基础入门在线课程,免费送给圈友们,供巩固

浏览 12
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报