字典也是Python中的一个重要的序列结构,是字典是任意对象的无序集合。字典是以“键-值对”的形式来存储数据,通过键从字典中获取指定项,但不能通过索引来获取。
● 字典是无序的,各项是从左到右随机排序的,即保存在字典中的项没有特定的顺序。这样可以提高查找效率。
● 字典是可变的,并且可以任意嵌套。
● 字典中的键必须唯一,一个键只能对应一个值,若字典键重复赋值,后一个值将覆盖前一个值。
● 字典中的键必须是可哈希的对象,即不可变的数据类型。
● 字典中的值没有限制,可以是任何数据类型,不是必须唯一的。
定义字典时,每个元素都包含两个部分:“键”和“值”。
创建字典时,在“键”和“值”之间使用冒号分隔,相邻两个元素使用逗号分隔,所有元素放在一对“{}”中,语法格式如下:
dictionary={'key1':'value1','key2':'value2',…,'keyn':'valuen',}
参数说明:
● dictionary:表示字典名称。
● keyl,key2,…,keyn:表示元素的键,必须是唯一的,并且是不可变的数据类型,例如,可以是字符串、数字或者元组。
● valuel,value2,…,valuen:表示元素的值,可以是任何数据类型,不是必须唯一的。
【例3.38】创建一个保存通信录信息的字典。
dictionary = {'Bob': '12345678', 'Lily': '12345679', 'Helen': '23456789'} print(dictionary)
执行结果如下:
{'Lily': '12345679', 'Bob': '12345678', 'Helen': '23456789'}
同列表和元组一样,也可以创建空字典。在Python中,可以使用下面两种方法创建空字典:
dictionary = {} 或者 dictionary = dict()
Python中的dict()方法除了可以创建一个空字典外,还可以通过已有数据快速创建字典,主要表现为以下两种形式:
通过映射函数创建字典的语法如下:
dictionary = dict(zip(list1,list2))
参数说明:
● dictionary:表示字典名称。
● zip()函数:用于将多个列表或元组对应位置的元素组合为元组,并返回包含这些内容的zip对象。如果想获取元组,可以将zip对象使用tuple()函数转换为元组;如果想获取列表,则可以使用list()函数将其转换为列表。
在Python 2.x中,zip()函数返回的内容为包含元组的列表。
● listl:一个列表,用于指定要生成字典的键。
● list2:一个列表,用于指定要生成字典的值。如果listl和list2的长度不同,则取最短的列表长度。
【例3.39】通过映射函数创建字典。
tinydict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} print "tinydict['Name']: ", tinydict['Name'] print "tinydict['Age']: ", tinydict['Age']
运行上面的代码,输出结果如下:
tinydict['Name']: Zara tinydict['Age']: 7
通过给定的“键-值对(key-value pair)”创建字典的语法如下:
dictionary = dict(key1=value1, key2=value2,…, keyn=valuen)
参数说明:
● dictionary:表示字典名称。
● keyl,key2,…,keyn:表示元素的键,必须是唯一的,并且是不可变的数据类型,例如可以是字符串、数字或者元组。
● valuel,value2,…,valuen:表示元素的值,可以是任何数据类型,不是必须唯一的。
在Python中,还可以使用dict对象的fromkeys()方法创建值为空的字典,语法格式如下:
dictionary = dict.fromkeys(list1)
参数说明:
● dictionary:表示字典名称。
● listl:作为字典的键的列表。
【例3.40】创建名为dict1的字典。
dict1 = dict(name="Jing",age=20,university="DMU")
在Python中,如果想输出字典的内容也是比较简单的,可以直接使用print()函数。但是,在使用字典时,很少直接输出它的内容,一般需要根据指定的键得到相应的结果。在Python中,访问字典的元素可以通过下标的方式实现,与列表和元组不同,这里的下标不是索引号,而是键。
【例3.41】通过键访问字典中的元素。
dictionary = {'Bob': '12345678', 'Lily': '12345679', 'Helen': '23456789'} print(dictionary['Bob'])
执行结果如下:
12345678
另外,在Python中推荐的方法是使用字典对象的get()方法获取指定键的值,其语法格式如下:
dictionary.get(key[,default])
参数说明:
● dictionary:为字典对象,即要从中获取值的字典。
● key:为指定的键。
● default:为可选项,用于指定当指定的“键”不存在时,返回一个默认值,如果省略,则返回None。
【例3.42】使用字典对象的get()方法获取指定键的值。
tinydict = {'Name': 'Runoob', 'Age': 27} print ("Age : %s" % tinydict.get('Age')) # 没有设置 Sex,也没有设置默认的值,输出 None print ("Sex : %s" % tinydict.get('Sex')) # 没有设置 Salary,输出默认的值 0.0 print ('Salary: %s' % tinydict.get('Salary', 0.0))
运行上面的代码,输出结果如下:
Age : 27 Sex : None Salary: 0.0
字典是以“键-值对”的形式存储数据的,所以要获取存储数据时也需要通过这些“键-值对”进行获取。Python提供了遍历字典的方法,通过遍历可以获取字典中的全部“键-值对”。
使用字典对象的items()方法可以获取字典的“键-值对”列表,其语法格式如下:
dictionary.items()
参数说明:
● dictionary:为字典对象。
● 返回值为可遍历的(键-值对)的元组列表。
● 想要获取到具体的“键-值对”,可以通过for循环遍历该元组列表。
【例3.43】使用for循环遍历字典列表。
tinydict = {'Google': 'www.google.com', 'Runoob': 'www.runoob.com', 'taobao': 'www.taobao.com'} print "字典值 : %s" % tinydict.items() # 遍历字典列表 for key,values in tinydict.items(): print key,values
运行上面的代码,输出结果如下:
字典值 : [('Google', 'www.google.com'), ('taobao', 'www.taobao.com'), ('Runoob', 'www.runoob.com')] Google www.google.com taobao www.taobao.com Runoob www.runoob.com
在Python中,字典对象还提供了values()方法和keys()方法,用于返回字典的“值”列表和“键”列表,它们的使用方法同items()方法类似,也需要通过for循环遍历该字典列表,获取对应的值和键。
由于字典是可变序列,所以可以随时在字典中添加“键-值对”。向字典中添加元素的语法格式如下:
dictionary[key] = value
参数说明:
● dictionary:表示字典名称。
● key:表示要添加元素的键,必须是唯一的,并且是不可变的数据类型,例如可以是字符串、数字或者元组。
● value:表示元素的值,可以是任何数据类型,不是必须唯一的。
【例3.44】向字典中添加元素。
tinydict = {'Name': 'Zara', 'Age': 7, 'Class': 'First'} tinydict ['hello'] = 'world' print (tinydict ['hello'])
运行上面的代码,输出结果如下:
World
使用字典推导式可以快速生成一个字典,它的表现形式和列表推导式类似。
【例3.45】生成一个包含4个随机数的字典,其中字典的键使用数字表示。
import random # 导入random标准库 randomdict = {i: random.randint(10, 100) for i in range(1, 5)} print("生成的字典为:", randomdict)
执行结果如下:
生成的字典为: {1: 76, 2: 17, 3: 94, 4: 49}
另外,使用字典推导式也可以根据列表生成字典。
【例3.46】使用字典推导式根据列表生成字典。
listdemo = ['C语言','c.biancheng.net'] # 列表中各字符串值为键,各字符串的长度为值,组成键值对 newdict = {key:len(key) for key in listdemo} print(newdict)
运行上面的代码,输出结果如下:
{'C语言': 6, 'c.biancheng.net': 15}