Python学习--字典
字典
[!NOTE]
以下内容部分摘录自
《Python编程快速上手——让繁琐的工作自动化(第二版)》
,并加入了一些自己的理解,仅用于个人交流与学习,如涉及侵权请联系站长删除!
1. 字典数据类型
像列表一样,字典是许多值的集合,但不像列表的索引,字典的索引可以使用许多不同的数据类型,不只是整数。
- 字典的索引:字典的索引被称之为“键”,键及其关联的值被称之为“键-值对”。
- 注意:字典输入时带
{}
。
接下来我们可以试着创建一个字典并赋给变量myCat
。
1 | myCat = {'size': 'fat', 'color':'gray', 'disposition':'loud'} |
- 解释:变量
myCat
中的这个字典的键就是size
、color
和disposition
,而他们相对应的值对就是fat
、gray
、loud
。而我们print
所打印的值就是这些值。
就像列表一样字典也可以用整数作为键,但他可以是任何数字,不必用零开始,如下所示:
1 | spam = {12345: 'Luggage Combination', 42: 'The Answer'} |
1.1 字典与列表
不像列表,字典中的项目是不排序的。
1 | spam = ['cat', 'dogs', 'moose'] |
- 解释:在名为
spam
的列表中,第一项是spam[0]
,但在字典中没有“第一个”项,虽然在确定两个列表是否相同的,表象的顺序很重要,但在字典中“键-值对”输入的顺序并不重要。(因为字典是不排序的,所以不能像列表那样切片)。
尝试访问列表中不存在的键,将会出现KeyError
报错信息
1 | spam = {'name': 'Zophie', 'age': 7} |
- 解释:输入以上代码并试着运行起来就会发现
KeyError
错误信息。
我们可以通过字典是不排序的,可以使用任意的值来作为键来编写一个小程序,用来记录朋友的生日。
1 | birthdays = {'Alice': 'Apr 1', 'Bob': 'Dec 12', 'Carol': 'Mar 4'} |
- 解释:这里创建了一个字典将他保存到名叫
birthday
的变量中,用来存放生日。用in
关键字,可以查看输入的名字是否作为键存放在字典中。如果在字典中,我们可以用[]
访问他们关联的值,如果不在我们可以用同样的方法添加他们。(程序终止时输入的所有数据就丢失了,因为我们没有将他们保存在硬盘文件中。)
1.2 keys()
、values()
和item()
方法
字典中有三个方法,他们将返回类似列表的值,分别对应字典的键、值、键-值对:keys()
、values()
和item()
方法。这些方法返回的值不是真正的列表,他们不可被修改,没有append()
方法,但这些数据类型 可以使用for循环。
1 | spam = {'color': 'red', 'age': 42} |
解释:利用
keys()
、values()
和item()
方法,循环分别可以迭代键、值、键-值对。需要注意的是,item()
方法返回的dict_item
值包含的是键和值的元组,如果希望的到一个真正的列表,就把类似列表的值返回给list()函数,具体如下:1
2
3spam2 = {'color': 'red', 'age': 42}
print(spam2.keys()) # 输出的结果为dict_keys(['color', 'age'])
print(list(spam2.keys())) # 输出的结果为['color', 'age']- 解释:
list(sapm2.keys())
代码接收keys()
函数返回的dict_keys
值,并传给list()
函数,然后返回一个列表,即['color', 'age']
。
- 解释:
也可以利用多重赋值技巧,在for循环中将键和值赋给不同的变量。
1 | spam3 = {'color': 'red', 'age': 42} |
1.3 检查字典中是否存在键或值
in
或者in not
操作符可以检查值是否存在于列表中,也可以利用这些操作符检查某个键或值是否存在于字典中。
1 | spam = {'name': 'Zophie', 'age': 7} |
- 解释:请注意 在前面的例子中
‘color' in spam
本质上是一个简写的版本 相当于'color' in spam.keys()
,这种情况总是对的 如果要想检查一个值是否为字典中的键 就可以将关键字in
或者not in
作用于该字典本身。
1.4 get()
方法
在访问一个值之前,检查该键是否在字典中,这很麻烦。这里我们用到get()
方法,他有两个参数:1.要取得其值的键 2.当该键不存在时,返回备用的值。
1 | picnicItems = {'apple': 5, 'cups': 2} |
- 解释:因为
picnicItems
字典中没有'eggs'
键 所以get()
方法返回的默认值是0,不使用get()
方法就会报错。
1.5 setdefault()
方法
我们常常需要为字典中的某一个键设置一个默认值,当该键没有任何值使用它时。代码看起来像这样:
1 | spam = {'name': 'Pooka', 'age': 5} |
setdefualt()
方法提供了一种方式,可以在一行中完成这件事,该方法有两个参数:1.第一个参数是要检查的键(即查看该键是否在字典中)2.第二个参数是当该键不存在时需要设置的值。注意:如果该键的确存在,setdefualt()
方法就会返回键的值,如果不存在则会返回setdefualt()
方法的第二个参数值。
1 | spam = {'name': 'Pooka', 'age': 5} |
- 解释:当第一次调用
setdefualt()
方法时,spam
变量中的字典变为{'color': 'black', 'age': 5, 'name': 'Pooka'}
,该方法的返回值为black
。 - 解释:当第二次调用
setdefualt()
方法时,我们可以发现输出的结果没有变化,这是因为spam
变量中的字典里已经有了名为'color'
的键了。
setdefualt()
方法是一个很好的快捷方式,可以确保有一个键的存在,下面这个程序可以计算一个字符串中每个字符出现的次数。
1 | message = 'It was a bright cold day in April, and the clocks were striking thirteen.' |
- 解释:
message
存放我们需要计算的字符串,count = {}
这里我们初始化了一个空字典,用来存放字符及其出现次数,for character in message:
这里我们遍历字符串(包括空格和标点符号),一次将字符赋值给变量character
,count.setdefault(character, 0)
这里我们调用setdefualt()
方法:若character
不在字典中,则添加该键并设置默认值0
,若已存在,则不改变其当前值。最后我们在使用count[character] = count[character] + 1
将当前字符的计数值加1,更新到字典中。
2. 美观的输出
如果程序中导入了pprint()
模块,就可以使用pprint()
和pformat()
函数,这些函数将为我们美观的输出一个字典,以我们上方的字符串计算程序为例:
1 | import pprint |
以上代码的输出结果如下(pprint.pprint()
与print(pprint.pformat())
是等价的,所以我们只展示一遍。)
1 | {' ': 13, |