第七章 字典

1. 字典的创建和删除

在Python中,字典与列表类似,也是可变序列,不过与列表不同,它是 无序的可变序列,保存的内容是以“键-值对”的形式存放的。这类似于我们的新华字典,它可以把拼音和汉字关联起来,通过音节表可以快速找到想要的汉字。其中新华字典里的音节表相当于键(key),而对应的汉字,相当于值(value)。键是唯一的,而值可以有多个。字典在定义一个包含多个命名字段的对象时,很有用。

字典的主要特征如下:

  • 通过键而不是通过索引来读取
    字典有时也称为关联数组或者散列表(hash)。它是通过键将一系列的值联系起来的,这样就可以通过键从字典中获取指定项,但不能通过索引来获取。

  • 字典是任意对象的无序集合
    字典是无序的,各项是从左到右随机排序的,即保存在字典中的项没有特定的顺序。这样可以提高查找效率。

  • 字典是可变的,并且可以任意嵌套
    字典可以在原处增长或者缩短(无须生成一个副本)。并且它支持任意深度的嵌套(即它的值可以是列表或者其他的字典)。

  • 字典中的键必须唯一
    不允许同一个键出现两次,如果出现两次,则后一个值会被记住。

  • 字典中的键必须不可变
    字典中的键是不可变的,所以可以使用数字、字符串或者元组,但不能使用列表。

创建字典时,在“键”和“值”之间使用冒号分隔,相邻两个元素使用逗号分隔,所有元素放在一对“{}”中。语法格式如下:

dictionary = {'key1':'value1', 'key2':'value2',, 'keyn':'valuen',}

参数说明:

  • dictionary:表示字典名称。

  • key1、key2…keyn:表示元素的键,必须是唯一的,并且不可变,例如,可以是字符串、数字或者元组。

  • value1、value2…valuen:表示元素的值,可以是任何数据类型,不是必须唯一的。

例如,创建一个保存通讯录信息的字典,可以使用下面的代码:

dictionary = {'qq':'84978981','明日科技':'84978982','无语':'0431-84978981'}
print(dictionary)

同列表和元组一样,也可以创建空字典。在Python中,可以使用下面两种方法创建空字典:

dictionary = {}

或者

dictionary = dict()

Python中的dict()方法除了可以创建一个空字典外,还可以通过已有数据快速创建字典。

1.1 通过映射函数创建字典

通过映射函数创建字典的语法如下:

dictionary = dict(zip(list1,list2))

参数说明:

  • dictionary:表示字典名称。

  • zip()函数:用于将多个列表或元组对应位置的元素组合为元组,并返回包含这些内容的zip对象。如果想获取元组,可以将zip对象使用tuple()函数转换为元组;如果想获取列表,则可以使用list()函数将其转换为列表。

说明:在Python 2.x中,zip()函数返回的内容为包含元组的列表。

  • list1:一个列表,用于指定要生成字典的键。

  • list2:一个列表,用于指定要生成字典的值。如果list1和list2的长度不同,则与最短的列表长度相同。

1.2 通过给定的关键字参数创建字典

通过给定的关键字参数创建字典的语法如下:

dictionary = dict(key1=value1,key2=value2,,keyn=valuen)

参数说明:

  • dictionary:表示字典名称。

  • key1,key2,…,keyn:表示参数名,必须是唯一的,并且符合Python标识符的命名规则。该参数名会转换为字典的键。

  • value1,value2,…,valuen:表示参数值,可以是任何数据类型,不必须唯一。该参数值将被转换为字典的值。

例如,将名字和星座以关键字参数的形式创建一个字典,可以使用下面的代码:

dictionary =dict(绮梦 = '水瓶座', 冷伊一 = '射手座', 香凝 = '双鱼座', 黛兰 = '双子座')
print(dictionary)

在Python中,还可以使用dict对象的fromkeys()方法创建值为空的字典,语法如下:

dictionary = dict.fromkeys(list1)

参数说明:

  • dictionary:表示字典名称。

  • list1:作为字典的键的列表。

例如,创建一个只包括名字的字典,可以使用下面的代码:

name_list = ['绮梦','冷伊一','香凝','黛兰']           # 作为键的列表
dictionary = dict.fromkeys(name_list)
print(dictionary)

执行结果如下:

{'绮梦': None, '冷伊一': None, '香凝': None, '黛兰': None}

另外,还可以通过已经存在的元组和列表创建字典。例如,创建一个保存名字的元组和保存星座的列表,通过它们创建一个字典,可以使用下面的代码:

name_tuple = ('绮梦','冷伊一', '香凝', '黛兰')          	# 作为键的元组
sign = ['水瓶座','射手座','双鱼座','双子座']            	# 作为值的列表
dict1 = {name_tuple:sign}                          		# 创建字典
print(dict1)

执行结果如下:

{('绮梦', '冷伊一', '香凝', '黛兰'): ['水瓶座', '射手座', '双鱼座', '双子座']}

说明:不能使用列表作为字典的键,因为列表是可变的,在字典中作为键不可哈希。可以使用元组作为健来创建字典。

同列表和元组一样,不再需要的字典也可以使用del命令删除整个字典。例如,通过下面的代码即可将已经定义的字典删除。

del dictionary

另外,如果只是想删除字典的全部元素,可以使用字典对象的clear()方法实现。执行clear()方法后,原字典将变为空字典。例如,下面的代码将清除字典的全部元素。

dictionary.clear()

除了上面介绍的方法可以删除字典元素,还可以使用字典对象的pop()方法删除并返回指定“键”的元素,以及使用字典对象的popitem()方法删除并返回字典中的一个元素。

2. 通过键值对访问字典

在Python中,如果想将字典的内容输出也比较简单,可以直接使用print()函数。例如,要想打印dictionary字典,则可以使用下面的代码:

name = ['绮梦','冷伊一','香凝','黛兰']            # 作为键的列表
sign = ['水瓶座','射手座','双鱼座','双子座']          # 作为值的列表
dictionary = dict(zip(name,sign))                # 转换为字典
print(dictionary)

执行结果如下:

{'绮梦': '水瓶座', '冷伊一': '射手座', '香凝': '双鱼座', '黛兰': '双子座'}

但是,在使用字典时,很少直接输出它的内容。一般需要根据指定的键得到相应的结果。在Python中,访问字典的元素可以通过下标的方式实现,与列表和元组不同,这里的下标不是索引号,而是键。例如,想要获取“冷伊一”的星座,可以使用下面的代码:

print(dictionary['冷伊一'])

执行结果如下:

射手座

在使用该方法获取指定键的值时,如果指定的键不存在,就会抛出异常。

在实际开发中,我们可能不知道当前存在什么键,所以需要避免该异常的产生。具体的解决方法是使用if语句对不存在的情况进行处理,即设置一个默认值。例如,可以将上面的代码修改为以下内容:

print("冷伊的星座是:",dictionary['冷伊'] if '冷伊' in dictionary else '我的字典里没有此人')

另外,Python中推荐的方法是使用字典对象的get()方法获取指定键的值,语法格式如下:

dictionary.get(key[,default])

参数说明:

  • dictionary:为字典对象,即要从中获取值的字典。

  • key:为指定的键。

  • default:为可选项,用于指定当指定的“键”不存在时,返回一个默认值,如果省略,则返回None。

例如,通过get()方法获取“冷伊一”的星座,可以使用下面的代码:

print("冷伊一的星座是:",dictionary.get('冷伊一'))

说明:为了解决在获取指定键的值时,因不存在该键而导致抛出异常,可以为get()方法设置默认值,这样当指定的键不存在时,得到结果就是指定的默认值。

3. 遍历字典

字典是以“键-值对”的形式存储数据的,所以需要通过这些“键-值对”进行获取。Python提供了遍历字典的方法,通过遍历可以获取字典中的全部“键-值对”。

使用字典对象的items()方法可以获取字典的“键-值对”列表,语法格式如下:

dictionary.items()

其中,dictionary为字典对象;返回值为可遍历的(键-值对)的元组列表。想要获取到具体的“键-值对”,可以通过for循环遍历该元组列表。

例如,定义一个字典,然后通过items()方法获取“键-值对”的元组列表,并输出全部“键-值对”,代码如下:

dictionary = {'qq':'84978981','明日科技':'84978982','无语':'0431-84978981'}
for item in dictionary.items():
    print(item)

如果想要获取具体的每个键和值,可以使用下面的代码进行遍历。

dictionary = {'qq':'4006751066','明日科技':'0431-84978982','无语':'0431-84978981'}
for key,value in dictionary.items():
    print(key,"的联系电话是",value)

说明:在Python中,字典对象还提供了values()方法和keys()方法,用于返回字典的“值”和“键”列表,它们的使用方法同items()方法类似,也需要通过for循环遍历该字典列表,获取对应的值和键。

4. 添加、修改和删除字典元素

由于字典是可变序列,所以可以随时在字典中添加“键-值”对。向字典中添加元素的语法格式如下:

dictionary[key] = value

参数说明:

  • dictionary:表示字典名称。

  • key:表示要添加元素的键,必须是唯一的,并且不可变,例如可以是字符串、数字或者元组。

  • value:表示元素的值,可以是任何数据类型,不是必须唯一的。

例如,还以保存4位美女星座的场景为例,在创建的字典中添加一个元素,并显示添加后的字典,代码如下:

dictionary =dict((('绮梦', '水瓶座'),('冷伊一','射手座'), ('香凝','双鱼座'), ('黛兰','双子座'))) 
dictionary["碧琦"] = "巨蟹座"       # 添加一个元素
print(dictionary)

由于在字典中,“键”必须是唯一的,如果新添加元素的“键”与已经存在的“键”重复,那么将使用新的“值”替换原来该“键”的值,这也相当于修改字典的元素。例如,再添加一个“键”为“香凝”的元素,设置她的星座为“天蝎座”。可以使用下面的代码:

dictionary =dict((('绮梦', '水瓶座'),('冷伊一','射手座'), ('香凝','双鱼座'), ('黛兰','双子座'))) 
dictionary["香凝"] = "天蝎座"       # 添加一个元素,当元素存在时,则相当于修改功能
print(dictionary)

当字典中的某一个元素不需要时,可以使用del命令将其删除。例如,要删除字典dictionary中的键为“香凝”的元素(一个键可对应多个元素),可以使用下面的代码:

dictionary =dict((('绮梦', '水瓶座'),('冷伊一','射手座'), ('香凝','双鱼座'), ('黛兰','双子座')))
del dictionary["香凝"]            # 删除一个元素
print(dictionary)

注意:当删除一个不存在的键时,将抛出异常。因此,为防止删除不存在的元素时抛出异常,可将上面的代码修改成如下内容:

dictionary =dict((('绮梦', '水瓶座'),('冷伊一','射手座'), ('香凝','双鱼座'), ('黛兰','双子座')))
if "香凝1" in dictionary:                        # 如果存在
    del dictionary["香凝1"]                     # 删除一个元素
print(dictionary)

5. 字典推导式

使用字典推导式可以快速生成一个字典,它的表现形式和列表推导式类似。例如,我们可以使用下面的代码生成一个包含4个随机数的字典,其中字典的键使用数字表示。

import random                             # 导入random标准库
randomdict = {i:random.randint(10,100) for i in range(1,5)}
print("生成的字典为:",randomdict)

执行结果如下:

生成的字典为: {1: 21, 2: 85, 3: 11, 4: 65}

另外,使用字典推导式也可根据列表生成字典。

name = ['绮梦','冷伊一','香凝','黛兰']                    # 作为键的列表
sign = ['水瓶','射手','双鱼','双子']                      # 作为值的列表
dictionary = {i:j+'座' for i,j in zip(name,sign)}      # 使用列表推导式生成字典
print(dictionary)                                       # 输出转换后字典
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值