3.4 字典
字典是包含若干“键:值”元素的无序可变序列,字典中的每个元素包含用冒号分隔开的“键”和“值”两部分,表示一种映射或对应关系,也称关联数组。定义字典时,每个元素的“键”和“值”之间用冒号分隔,不同元素之间用逗号分隔,所有的元素放在一对大括号“{}”中。
字典中元素的“键”可以是Python中任意不可变数据,例如,整数、实数、复数、字符串、元组等类型可散列数据,但不能使用列表、集合、字典或其他可变类型作为字典的“键”。另外,字典中的“键”不允许重复,而“值”是可以重复的。使用内置字典类型dict时不要太在乎元素的先后顺序。
3.4.1 字典创建与删除
使用赋值运算符“=”将一个字典赋值给一个变量即可创建一个字典变量,也可以使用内置类dict以不同形式创建字典。当不再需要时,可以直接del删除字典。
> > > aDict = {'server': 'db.diveintopython3.org', 'database': 'mysql'} > > > aDict {'server': 'db.diveintopython3.org', 'database': 'mysql'} > > > x = dict() #空字典 > > > x = {} #空字典 > > > keys = ['a', 'b', 'c', 'd'] > > > values = [1, 2, 3, 4] > > > d = dict(zip(keys, values)) #根据已有数据创建字典 > > > d {'a': 1, 'b': 2, 'c': 3, 'd': 4} > > > d = dict(name='Dong', age=39) #以关键参数的形式创建字典 > > > d {'name': 'Dong', 'age': 39} > > > aDict = dict.fromkeys(['name', 'age', 'sex']) #以给定内容为“键” #创建“值”为空的字典 > > > aDict {'name': None, 'age': None, 'sex': None} > > > del aDict #删除字典aDict
3.4.2 字典元素的访问
字典中的每个元素表示一种映射关系或对应关系,根据提供的“键”作为下标就可以访问对应的“值”,如果字典中不存在这个“键”会抛出异常。
> > > aDict = {'age': 39, 'score': [98, 97], 'name': 'Dong', 'sex': 'male'} > > > aDict['age'] #指定的“键”存在,返回对应的“值” 39 > > > aDict['address'] #指定的“键”不存在,抛出异常 KeyError: 'address'
字典对象提供了一个get()方法用来返回指定“键”对应的“值”,并且允许指定该键不存在时返回特定的“值”。例如:
> > > aDict.get('age') #如果字典中存在该“键”,则返回对应的“值” 39 > > > aDict.get('address', 'Not Exists.') #指定的“键”不存在时返回指定的默认值 'Not Exists.'
最后,也可以对字典对象进行迭代或者遍历,默认是遍历字典的“键”,如果需要遍历字典的元素必须使用字典对象的items()方法明确说明,如果需要遍历字典的“值”则必须使用字典对象的values()方法明确说明。当使用len()、max()、min()、sum()、sorted()、enumerate()、map()、filter()等内置函数以及成员测试运算符in对字典对象进行操作时,也遵循同样的约定。
> > > aDict = {'age': 39, 'score': [98, 97], 'name': 'Dong', 'sex': 'male'} > > > for item in aDict: #默认遍历字典的“键” print(item)
score age sex Name > > > for item in aDict.items(): #明确指定遍历字典的元素 print(item)
('score', [98, 97]) ('age', 39) ('sex', 'male') ('name', 'Dong') > > > for value in aDict.values(): #明确指定遍历字典的值 print(value)
39 [98, 97] Dong male > > > aDict.items() #查看字典中的所有元素 dict_items([('age',37), ('score', [98,97]), ('name', 'Dong'), ('sex', 'male')]) > > > aDict.keys() #查看字典中的所有键 dict_keys(['age', 'score', 'name', 'sex']) > > > aDict.values() #查看字典中的所有值 dict_values([37, [98, 97], 'Dong', 'male'])
3.4.3 元素的添加、修改与删除
当以指定“键”为下标,为字典元素赋值时,有两种含义。
1)若该“键”存在,则表示修改该“键”对应的值。
2)若不存在,则表示添加一个新的“键:值”对,也就是添加一个新元素。
> > > aDict = {'age': 35, 'name': 'Dong', 'sex': 'male'} > > > aDict['age'] = 39 #修改元素值 > > > aDict {'age': 39, 'name': 'Dong', 'sex': 'male'} > > > aDict['address'] = 'Yantai' #添加新元素 > > > aDict {'age': 39, 'address': 'Yantai', 'name': 'Dong', 'sex': 'male'}
使用字典对象的update()方法可以将另一个字典的“键:值”一次性全部添加到当前字典对象,如果两个字典中存在相同的“键”,则以另一个字典中的“值”为准对当前字典进行更新。
> > > aDict = {'age': 37, 'score': [98, 97], 'name': 'Dong', 'sex': 'male'} > > > aDict.update({'a':97, 'age':39}) #修改’age’键的值,同时添加新元素’a':97 > > > aDict {'score': [98, 97], 'sex': 'male', 'a': 97, 'age': 39, 'name': 'Dong'}
可以使用字典对象的pop()和popitem()方法弹出并删除指定的元素,例如:
> > > aDict = {'age': 37, 'score': [98, 97], 'name': 'Dong', 'sex': 'male'} > > > aDict.popitem() #弹出一个元素,对空字典会抛出异常 ('age', 37) > > > aDict.pop('sex') #弹出指定键对应的元素 'male' > > > aDict {'score': [98, 97], 'name': 'Dong'}
3.4.4 字典应用案例
例3-4 首先生成包含1000个随机字符的字符串,然后统计每个字符的出现次数,注意get()方法的运用。
基本思路:在Python标准库string中,ascii_letters表示英文字母大小写,digits表示10个数字字符。本例中使用字典存储每个字符的出现次数,其中键表示字符,对应的值表示出现次数。在生成随机字符串时使用到了生成器表达式,''.join(…)的作用是使用空字符串把参数中的字符串连接起来成为一个长字符串。最后使用for循环遍历该长字符串中的每个字符,把每个字符的已出现次数加1,如果是第一次出现,就假设已出现次数为0。
> > > import string > > > import random > > > x = string.ascii_letters + string.digits > > > z = ''.join((random.choice(x) for i in range(1000))) #choice()用于从多个元素中随机选择一个 > > > d = dict() > > > for ch in z: #遍历字符串,统计频次 d[ch] = d.get(ch, 0) + 1 #已出现次数加1 > > > for k, v in sorted(d.items()): #查看统计结果 print(k, ':', v)
运行结果如下:
0 : 15 1 : 12 2 : 21 3 : 12 4 : 13 5 : 14 6 : 10 7 : 14 8 : 15 9 : 10 A : 15 B : 24 …(略去更多输出结果。注意,字符串z是随机的,所以每次运行结果会不同)