(请先看置顶博文)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循环内部的代码就会复杂起来。

十、Python第十课——字典的些许知识(重点)相关推荐

  1. python六十七课——网络编程(基础知识了解)

    网络编程: 什么是网络编程? 网络:它是一种隐形的媒介:可以将多台计算机使用(将它们连接到一起) 网络编程:将多台计算机之间可以相互通信了(做数据交互) 一旦涉及到网络编程,划分为两个方向存在,一方我 ...

  2. Python学习记录 基于《Python编程 从入门到实践》 Python基础 Python第五课 字典

    创建一个简单的字典 ball={'football':'black and white','tennis':'green'} print(ball['football']) print(ball['t ...

  3. python 列表 元祖 字典 集合_python基础知识之列表、元祖、字典、集合、字符串。...

    1.可变类型之列表 列表用 [ ]来定义是可变的,可以通过索引值来去查询里面的字段可以可以追加,删除等 ```python names='zhangyang guyun xiangpeng xulia ...

  4. LInux 些许知识

    1.Linux下去掉^M的方法 ①dos2unix filename ②sed -i 's/^M//g' filename #注意:^M的输入方式是 Ctrl + v ,然后Ctrl + M 2.so ...

  5. 十一、Python第十一课——用户输入和另一种循环(While)

    (请先看置顶博文)https://blog.csdn.net/GenuineMonster/article/details/104495419 学了这么久的Python,大家肯定会好奇,不是说机器学习 ...

  6. python网络编程知识_python六十七课——网络编程(基础知识了解)

    网络编程: 什么是网络编程? 网络:它是一种隐形的媒介:可以将多台计算机使用(将它们连接到一起) 网络编程:将多台计算机之间可以相互通信了(做数据交互) 一旦涉及到网络编程,划分为两个方向存在,一方我 ...

  7. python第二十九课——文件读写(复制文件)

    自定义函数:实现文件复制操作有形参(2个) 没有返回值相似版(不用) def copyFile(src,dest):#1.打开两个文件:1个关联读操作,1个关联写操作fr=open(src,'rb') ...

  8. Python第十课(函数3)

    Python第十课(函数3)    >>>转到思维导图>>>转到中二青年 闭包函数 1.定义在函数内部的函数 2.内部函数内部函数引用了外部函数名称空间作用域的名字 ...

  9. Python爬虫十六式 - 第三式:Requests的用法

    Requests: 让 HTTP 服务人类 学习一时爽,一直学习一直爽   Hello,大家好,我是Connor,一个从无到有的技术小白.今天我们继续来说我们的 Python 爬虫,上一次我们说到了 ...

最新文章

  1. JavaScript学习笔记(8)——JavaScript语法之运算符
  2. Oracle 数据库连接失败问题
  3. ASP.NET MVC的生命周期与网址路由
  4. 《深入理解C++11:C++ 11新特性解析与应用》——导读
  5. java内存泄漏案例_寻找内存泄漏:一个案例研究
  6. php获取ios,IOS 通过描述获取UDID PHP代码版
  7. 压测学习总结(7)——Jmeter性能测试之脚本增强
  8. 惠普电脑怎么用access_学习如何使用access帮助系统
  9. Hbase与传统关系型数据库对比
  10. 卧槽,入职 3 天就“偷”代码,备份 6300 个 Python 脚本,不讲武德啊
  11. cpc客户端紫屏问题解决方法
  12. python分词,提高分词准确率
  13. MS17010(永恒之蓝)漏洞复现
  14. 这么理解线程生命周期,是不是很简单?
  15. 公共场合的wifi 靠不住
  16. Kong 开源的服务网格Kuma爬过了K8S这座大山
  17. 人力资源管理案例选读【1】
  18. TOM企业邮箱,2021“重心出发”,聚焦企业邮箱安全办公!
  19. python统计列分布_pd.DataFrame统计各列数值多少的实例
  20. 仿微信朋友圈图片预览自定义View

热门文章

  1. hadoop上传文件java_hadoop入门之通过java代码实现将本地文件上传到hadoop的文件系统...
  2. pta段错误是什么意思_用Python执行Django数据迁移时报!(1091错误及解决方法)...
  3. java sdp_[java,SDP] java 7 SDP 技术/Socket Direct Protocol 2
  4. mysql主键重复会覆盖还是_mysql如果主键重复了会发生什么情况
  5. Zookeeper UI管理界面安装
  6. Dubbo Zookeeper Quick Start
  7. 数组,三种初始化和内存分析
  8. 网络发现协议服务器,关于 DHCP 服务器和网络发现
  9. 基于实战开发垂直搜索引擎_基于DDD的微服务设计和开发实战
  10. 字典 学生成绩等级_python-列表及字典进阶