(请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419
目录
(请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419
初识字典
1、创建字典
2、字典的“增删改查”
A、字典的“增”
B、字典的“删”
C、字典的“改”
D、字典的“查”
*由类似对象组成的字典
3、遍历字典
A、遍历字典键值对
B、遍历字典中所有的键
C、有序遍历字典中所有的键
D、遍历字典中所有的值
4、嵌套
A、字典列表(把字典存储在列表里)
B、列表字典(把列表存储在字典里)
C、字典字典(把字典存储在字典里)
初识字典
Python中“字典”的概念和我们小学学习使用的新华字典是一个概念。我们接下来对比一下这两个概念,方便大家理解和学习。
新华字典:A、拼音对应“字”或者笔画对应“字”(指两种查字方式)B、存储量有限,包含字音、笔顺、组词、例句、近义反义词等
Python中的字典:A、字典名和“键”对应“与键相关联的值” B、存储量无限,可以包含任意信息,比如:书中介绍的外星人的各种参数:颜色、分数。
上面只是一个对Python字典的一个简单的介绍,接下来,我们会详细介绍什么是字典?什么是键值对?如何创建字典?如何在字典中增加新的内容? 等等
1、创建字典
我们用几行代码,来演示如何创建字典:
alien_0={'color':'green','points':5} #创建外星人字典,包含属性为外星人的颜色及分值
print(alien_0['color']) #输出外星人的颜色
print(alien_0['points']) #输出外星人的分值
上述代码的第一行就是创建字典 ,在Python中,字典是一系列“键-值”对,每个键都与一个值相关联,与键相关联的值可以是数字、字符串、列表乃至字典。这个键值对就可以理解为键盘上的每一个键帽,你按哪个,哪个就出现在显示器上。就上述代码而言,alien_0是字典名,花括号里的“‘color:‘green’,‘point’:5”是两组键-值对(键-值对是两个相关联的值。指定键时,Python将返回与之相关联的值。键和值之间用冒号分隔,而每一组键-值对之间用逗号分隔。)在字典中,你想存储多少个键-值对都可以。
2、字典的“增删改查”
A、字典的“增”
字典是一种动态结构,可随时在其中增添键-值对。要增添键值对,可依次指定字典名、用方括号括起来的键和相关联的值。那么接下来我们仿照书中的例子,在刚才创建好的字典中,增加外星人的x、y的坐标,代码如下:
alien_0 = {'color' : 'green' , 'points' : 5 } #创建外星人字典,包含属性为外星人的颜色及分值
alien_0['x_position'] = 0 #外星人的横坐标为0
alien_0['y_position'] = 25 #外星人的纵坐标为25
print(alien_0) #打印外星人这个字典
到目前为止,刚刚创建的字典已经包含4个键值对了。Python不关心键-值对的添加顺序,而只关心键和值之间的关联关系。
有些特定情况下,我们需要先创建一个空白字典,然后再对其进行增添键-值对的操作。情景为:用字典保存用户输入的内容或在编写能自动生成大量键值对的代码时,预先定义一个空字典。如下代码所示:
alien_0 = {} #创建一个空字典
alien_0['color'] = 'green' #增添外星人颜色键值对
alien_0['points'] = 5 #增加外星人分数键值对
print(alien_0) #打印字典
B、字典的“删”
对于字典中我们不再需要的信息,可使用del语句将相应的键值对彻底删除。使用del语句时,必须指定字典名和要删除的键。代码如下所示:
alien_0={ 'color' : 'green', 'points' : 5 } #创建字典
print(alien_0) #打印字典
del alien_0['points'] #删除字典中的分数键及其键值
print(alien_0) #再次打印字典
C、字典的“改”
要修改字典中的值,可依次指定字典名、方括号括起的键以及该键相关联的新值 。例如随着游戏的进行需要将一个外星人从绿色改为黄色,代码如下:
alien_0={'color':'green'} #定义外星人字典,只有一对键值对(颜色)
print("The alien is "+alien_0['color']+". ") #打印外星人的字典
alien_0['color']='yellow' #将外星人的颜色改为黄色
print("The alien is "+alien_0['color']+". ") #再次打印外星人字典
D、字典的“查”
我们定义了键值对之后,就要通过指定键来访问键值对了。上述代码的第二、第三行就是通过指定字典名、键访问键值的实例。那么下面再给出一个例子:(这个例子是为后来的Python游戏项目服务的,用来显示用户实时获得的分数)
alien_0 = {'color':'green','points':5} #创建外星人字典,包含属性为外星人的颜色及分值
new_points = alien_0['points'] #访问外星人的点数,并存储在new_points中
print('You just earned '+str(new_points)+' points! ') #输出外星人的分值
*由类似对象组成的字典
前面的例子中,使用字典存储一个对象(游戏中的一个外星人)的多种信息,接下来我们使用字典存储众多对象中的同一种信息。例如存储多个人喜欢的编程语言。代码如下:
favorite_language={'jen':'Python', #将大字典放在了多行,其中的每个键都是一个人名,'sarah':"c", #每个值都是被调查者喜欢的语言'edward':"ruby",'pjil':"Python"}
#输出Sarah最喜欢的语言
#下面的print语句格式还演示了如何将较长的print语句分为多行
#在合适位置拆分打印内容,并在第一行末尾加上一个“+”,回车进入
#后续行,使用Tab键将他们对齐并缩进一级。指定所有打印的内容后,
#在print最后一行末尾加上右括号。
print("Sarah's favorite language is "+favorite_language['sarah'].title()+". ")
在这种情况下,大家要注意代码的格式,大多数编辑器都有自己的设置格式的功能。(Pycharm中可以使用Tab键和空格键控制格式,提高代码的可读性!)
3、遍历字典
刚才也说了,字典包含的信息量是无限的,所以就需要一种方法对字典进行查询(专业术语叫“遍历”),而Python也支持对字典的遍历。因为字典以多种方式存储信息,因此也有多种方法去遍历字典:可遍历字典的所有键-值对、键或者值。
A、遍历字典键值对
以代码为例,演示一下如何遍历字典键值对:
# 定义一个子字典,存储用户姓名
user_0={'username':'efermi','first':'erico','last':'fermi',}
# 一个for循环进行字典“遍历”
for key,value in user_0.items():
# 编写用于遍历字典的for循环,声明两个变量,用于存储键值对中的“键”和“值”
# 这两个变量名可以自己命名,不用拘于例代码,但最好让人易于理解。
# for这一行代码使用了items方法,此方法每次返回一个键值对的值,分别保存
# 在声明的两个变量中。print("\nKey: "+ key )print("Value: "+ value )
# 我看的参考书中,反复提及“键值对的返回顺序与存储顺序不同,Python不关心
# 键值对的存储顺序,只跟踪键和值的关联关系”
B、遍历字典中所有的键
在Python中Key()方法就是用来获取字典键的。通过例代码说明:
#创建一个字典
favorite_languages = {'jen':'python','sarah':'c','edward':'ruby','phil':'python'}
#循环获取字典中键值对的“键”,并打印
for name in favorite_languages.keys():print(name.title())
遍历字典,默认会遍历所有的键。所以如果在上述代码中不使用key()方法,输出是不会变的。我们现在有了字典的“键”,那么是否可以通过“键”来获取对应的“值”呢?答案是可以的,例代码如下:
# 创建一个字典
favorite_languages = {'jen':'python','sarah':'c','edward':'ruby','phil':'python'}
# 设定朋友范围
frinends=['phil','sarah']
# 循环获取字典中键值对的“键”,并打印
for name in favorite_languages.keys():# 在朋友范围内的才打印出来,下面的代码要记住print第三行“依键寻值”的表达if name in frinends:print("Hi "+name.title()+", "+"I see your favorite_languages is "+favorite_languages[name].title()+"! ")
C、有序遍历字典中所有的键
字典总是明确地记录键和值之间的关系,但获取字典的元素时,获取顺序是不可预测的。要以特定顺序返回元素,一种办法是在for循环中对返回的键进行排序。所以,我们可以使用函数sorted()来获得按特定顺序排列的键列表的副本:
# 创建一个字典
favorite_languages = {'jen':'python','sarah':'c','edward':'ruby','phil':'python'}# 循环获取字典中键值对的“键”,并打印.其中使用sorted函数
for name in sorted(favorite_languages.keys()):print(name.title()+", "+"thank you for taking the poll. ")
D、遍历字典中所有的值
如果我们的关注点在“值”而不在“键”上,那么我们可以使用values()方法,返回一个值列表。例如,我们只想知道一个这样的列表,其中只包含被调查者选择的各种语言,而不包含被调查者的名字,代码如下:
# 创建一个字典
favorite_languages = {'jen':'python','sarah':'c','edward':'ruby','phil':'python'}
print("The following languages have been mentioned:")
#使用values()方法返回键值对中的值,并输出
for language in favorite_languages.values():print(language.title())
上述代码在提取时,显而易见没有考虑到某种语言重复出现的情况。值少的时候还好,多的时候,最终的列表将会出现大量的重复项。这就需要我们使用一定的方法对上述的列表进行“剔除重复项”的操作。能完成这个操作的方法时set(),集合(大家都知道集合的三要素之一就是“唯一性”)。那么我们将这个方法加入到上述代码中:
# 创建一个字典
favorite_languages = {'jen':'python','sarah':'c','edward':'ruby','phil':'python'}
print("The following languages have been mentioned:")
#使用values()方法返回键值对中的值、set()方法剔除重复项,并输出
for language in set(favorite_languages.values()):print(language.title())
从结果可以看出,调用set()函数可让Python找出列表中独一无二的元素,并使用这些元素创造一个集合。
4、嵌套
有些时候,需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这称为嵌套。可以在列表中嵌套字典、在字典中嵌套列表甚至在字典中嵌套字典,由此可见嵌套是一项强大的功能。
A、字典列表(把字典存储在列表里)
还是我们老生常谈的外星人代码,我们之前创造的外星人字典alien_0里包含一个外星人的各种信息,但是无法存储第二个外星人的信息了,更别说成群结队的外星人信息了,那怎么办?第一种办法,创建一个外星人列表,其中每个外星人都是一个字典,包含有关该外星人的各种信息。例代码如下:
#外星人字典
alien_0 = {'color':'green','points':5}
alien_1 = {'color':'yellow','points':10}
alien_2 = {'coloe':'red','points':15}
#将三个外星人存储在列表alien里
aliens=[alien_0,alien_1,alien_2]
#使用for循环,打印三个外星人的字典
for alien in aliens:print(alien)
这是字典和列表嵌套的一个例子,在实际情况中,我们游戏中的外星人应该是很多的(不知这三个),那么我们就需要自动生成其他外星人,例代码如下:
# 创建一个外星人空列表
aliens=[]
# 使用for循环自动创建30个外星人(字典),并追加到上述创建好的外星人列表里
for alien_number in range(30):new_alien={'color':'green','points':5,'speed':'slow'}aliens.append(new_alien)
# 显示前5个外星人
for alien in aliens[:5]:print(alien)
# 显示省略号
print("......")
# 显示一共自动化创建了多少外星人,使用获取列表长度函数以及转换为字符串的函数
print("Total number of aliens: "+str(len(aliens)))
虽然代码的注释很清楚了,但还是对上面代码进行一个解释吧:例代码中,首先创建了一个空列表,用于存储接下来创建的所有外星人。range()返回一系列数字,唯一用途是告诉Python接下来要重复这个循环多少次。每次执行这个循环时,都会创建一个外星人,并将其追加到aliens末尾。最后再来一个循环,切片打印前五个外星人的字典,并打印省略号和外星人的总数目。
我们创建好的字典列表也可以通过3中所学的字典的“改”,对外星人的属性进行修改。必要时,可以使用for循环和if语句来修改某些外星人的颜色。
B、列表字典(把列表存储在字典里)
有时候,需要把列表存储在字典里。(需要与上一小节区别开,上一小节是把字典放在列表里,相当于宏观上还是列表。这个是把列表放在字典里,宏观上是字典。字典列表和列表字典分不清楚,就看最后两个字是字典还是列表。) 这里引入一个情景:比萨店如何记录顾客点的披萨呢?如果仅使用列表,那么只能存储要添加的披萨配料;但如果在前者的基础上加上字典,不仅可以在其中包含配料列表,还可包含其他有关披萨的描述。例代码如下:
# 存储所点披萨信息
pizza={'crust':'thick','toppings':['mushroom','extra cheese'],}
# 概述所点的披萨
print("You ordered a " + pizza['crust']+'-crust pizza' + ' with the following toppings:')for topping in pizza['toppings']:print('\t' + topping)
上面的代码首先创建了一个字典,其中存储了有关顾客所点披萨的信息。在这个字典中,一个键是‘crust’,与之相关联的值是字符串‘thick’;下一个键是‘toppings’,与之相关联的值是一个列表,其中存储了顾客要求添加的所有配料。最后对以上信息进行打印。每当需要在字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表。例如:
# 创建列表字典,存储每个人喜欢的语言
favorite_languages={'jen':['python','ruby'],'sarah':['c'],'edward':['ruby','go'],'phil':['python','haskell'],}
# 使用items()方法返回字典里的键值对
for name,languages in favorite_languages.items():print("\n" + name.title() + "'s favorite languages are: ")#对返回到languages里的语言进行循环输出for language in languages:print("\t" + language.title())
上述代码还有修改的余地:因为Sarah最喜欢的语言就只有一种,但是输出却是“are”,这不是犯了最低级的英语语法错误了吗?那么我们在最大for循环开始加一条if语句,调用len()判断一下返回到languages变量里的“长度”是多长,就可以针对不同的人进行不同的输出,避免错误的发生。除此以外,列表和字典的嵌套层级不应太多。如果嵌套层级太多,就会很搞脑子(手动狗头)。
C、字典字典(把字典存储在字典里)
字典和字典嵌套,代码比较复杂。使用场景:如果有多个网站用户,每个都有独特的用户名,可在字典中将用户名作为键,将每位用户的信息存储在一个字典A中,最后将键和字典A连接起来,形成大字典的键值对。例代码如下:
# 创建字典,里面使用字典存储用户个人信息
users = {'aeinstein':{'first':'albert','last':'einstein','location':'princeton'},'mcurie':{'first':'marie','last':'curie','location':'paris'},
}
# 循环语句,使用items()返回用户名和用户信息,将用户名存储在username里,将用户信息
# 字典存储在userinformation里
for username , userinformation in users.items():print("\nUsername: "+ username)# 对用户名的姓和名进行拼接,使用用户信息字典的键来遍历用户的姓、名、地址信息full_name = userinformation['first'] + " " + userinformation['last']location = userinformation['location']print("\tFull name: " + full_name.title())print("\tlocation: " + location.title())
注意:表示每位用户的字典的结构都相同,Python没这么要求,但这使得嵌套的字典处理起来更容易。如果表示每位用户的字典都包含不同的键,for循环内部的代码就会复杂起来。