python3.5修炼手册10

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3.5修炼手册10相关的知识,希望对你有一定的参考价值。

字典


字典的使用

在python中对字典进行了构造,让我们可以轻松的查到某个特定的键(类似拼音或笔画索引),从而通过键找到对应的值(类似具体某个字)。


创建和使用字典

字典的创建格式如下

a={key1:value1,key2:value2}

空字典的创建

b={}

注意:在创建字典的的时候键(key)必须唯一的,但值(value)不必。值可以取任何数据类型,键必须是不可变的,如字符串、数字或元组。


dict函数

dict函数 可以通过其他映射(如其他字典)或键/值序列对建立字典。

例如:

student=[(‘name‘,‘杜宇恒‘),(‘number‘,‘666‘)]
detai=dict(student)
print(‘学生详细信息:‘,detai)
print(‘学生姓名:‘,detai[‘name‘])
print(‘学生学号:‘,detai[‘number‘])

C:\python\python.exe C:/python.py/zidian.py

学生详细信息: {‘name‘: ‘杜宇恒‘, ‘number‘: ‘666‘}

学生姓名: 杜宇恒

学生学号: 666

上例可以看到dict函数可以就爱那个序列转换为字典

dict函数还可以通过关键字创建字典。

例如:

detail = dict(name=‘杜宇恒‘,number=‘666‘)
print(‘学生的详细信息:‘,detail)

C:\python\python.exe C:/python.py/zidian.py

学生的详细信息: {‘name‘: ‘杜宇恒‘, ‘number‘: ‘666‘}

通过关键字创建字典是dict函数非常有用的一个功能。


字典的基本操作

字典的基本操作在很多方面与序列(sequence)类似,支持删除修改等操作。


修改字典

向字典添加新内容的方法是是增加新键/值对,修改或删除已有键/值对,修改或删除已有键/值。

例如:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘}
#更新徐伟的学号
student[‘徐伟‘]=‘999‘
print(‘徐伟的学号是:%(徐伟)s‘%student)
#添加一个新的学生
student[‘杜兆利‘]=‘1000‘
print(‘杜兆利的学号是:%(杜兆利)s‘%student)
print(‘所有学生的信息:‘,student)

C:\python\python.exe C:/python.py/zidian.py

徐伟的学号是:999

杜兆利的学号是:1000

所有学生的信息: {‘杜兆利‘: ‘1000‘, ‘徐伟‘: ‘999‘, ‘杜宇恒‘: ‘666‘, ‘高爽‘: ‘888‘}


删除字典元素

此处的删除指的是显示删除,显示删除一个字典用del命令

例如:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘}
print(‘删除之前:‘,student)
#删除高爽
del student[‘高爽‘]
print(‘删除之后:‘,student)

C:\python\python.exe C:/python.py/zidian.py

删除之前: {‘杜宇恒‘: ‘666‘, ‘杜兆利‘: ‘999‘, ‘高爽‘: ‘888‘, ‘徐伟‘: ‘777‘}

删除之后: {‘杜宇恒‘: ‘666‘, ‘杜兆利‘: ‘999‘, ‘徐伟‘: ‘777‘}

除了删除键还可以删除整个字典

例如:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘}
del student
print(‘删除整个字典之后:‘,student)

C:\python\python.exe C:/python.py/zidian.py

Traceback (most recent call last):

  File "C:/python.py/zidian.py", line 8, in <module>

    print(‘删除整个字典之后:‘,student)

NameError: name ‘student‘ is not defined

报错:student没有定义

由上例可以看出删除字典之后就不能字典进行访问了,执行del操作后字典就不存在了


字典键的特性

①键必须是不可遍的,可以用数字,字符串或元组充当,不能用列表

②字典值可以没有限制的取任何pytho对象,既可以是标准对象,也可以是用户自定义对象,但键不行。

例如:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜宇恒‘:‘999‘}
print(student)

C:\python\python.exe C:/python.py/zidian.py

{‘杜宇恒‘: ‘999‘, ‘徐伟‘: ‘777‘, ‘高爽‘: ‘888‘}

一个键被赋值两次之后,后面的值会被记住


len函数

len函数用于计算字典元素的个数,即键的总数

例如:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘}
print(‘字典中元素的个数为:%d个‘%len(student))

C:\python\python.exe C:/python.py/zidian.py

字典中元素的个数为:4个


type函数

type(variable)函数返回输入的变量类型,如果输入变量的是字典就返回字典

例如:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘}
print(‘student的类型为:‘,type (student))

C:\python\python.exe C:/python.py/zidian.py

student的类型为: <class ‘dict‘>


字典的格式化字符串

字典的格式化方式是在每转换说明符中的%字符后加上圆括号括起来的键,在跟上其他说明元素。

例如:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘}
print(‘徐伟的学号是:%(徐伟)s‘%student)

C:\python\python.exe C:/python.py/zidian.py

徐伟的学号是:777

字典的格式化除了增加字符串外,转换说明符还像以前一样工作。以这种方式使用字典时,只要给出的键都能在字典中找到,就可以获得任意数量的转换说明符



字典和列表的区别

字典(dict)的特点是:

                查找和插入的速度极快,不会随着key的增加而变慢。

需要占用大量内存,内存浪费多。

列表(list)的特点是:

                 查找和插入时间随着元素的增加而增加。

占用空间小,浪费内存少

注意:dict内部存放的顺序和键放入的顺序是没有关系的。


字典方法


clera()方法

clera()方法用于删除字典内的所有项。

clera()方法语法如下:

        dict.clear()

  dict代表字典,不需要参数。该函数是一个原地操作(类似于list.sort)函数,没有任何返回值(返回值为None)

clera()方法演示:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘}
print(‘student字典中的元素为:%d个‘%len(student))
student.clear()
print(‘student字典删除元素后的个数为:%d个‘%len(student))

C:\python\python.exe C:/python.py/zidian.py

student字典中的元素为:4个

student字典删除元素后的个数为:0

字典调用clear方法后整个字典内所在的所有项都被删除。


copy方法

copy方法返回一个具有相同键/值对的新字典。这个方法是浅复制(shallow copy),因为值本身是相同的,而不是副本。

copy方法语法如下:

      dict.copy()

 dct代表字典,不需要参数。返回结果为一个字典的浅复制 

copy方法演示:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘}
st=student.copy()
print(‘复制后得到的st为:‘,st)

C:\python\python.exe C:/python.py/zidian.py

复制后得到的st为: {‘杜兆利‘: ‘999‘, ‘杜宇恒‘: ‘666‘, ‘徐伟‘: ‘777‘, ‘高爽‘: ‘888‘}

什么是浅复制?

示例:

student = {‘小智‘:‘1002‘,‘info‘:[‘小张‘,‘1006‘,‘man‘]}
st=student.copy()
st[‘小智‘] = ‘1005‘
print(‘更改copy后的st为:‘,st)
print(‘原字符串为:‘,student)
st[‘info‘].remove(‘man‘)
print(‘删除后st为:‘,st)
print(‘删除后student为:‘,student)

C:\python\python.exe C:/python.py/zidian.py

更改copy后的st为: {‘info‘: [‘小张‘, ‘1006‘, ‘man‘], ‘小智‘: ‘1005‘}

原字符串为: {‘info‘: [‘小张‘, ‘1006‘, ‘man‘], ‘小智‘: ‘1002‘}

删除后st为: {‘info‘: [‘小张‘, ‘1006‘], ‘小智‘: ‘1005‘}

删除后student为: {‘info‘: [‘小张‘, ‘1006‘], ‘小智‘: ‘1002‘}

从上例可以出,替换副本的值时原始字典不受影响。如果修改了某个值(原地修改,不是替换),原始字典就会改变,因为同样的值也原字典中以这样方式进行复制就是浅复制,使用深复制就可以避免该问题。

什么是深复制?

示例:

#深复制需要调用copy模块
import  copy
student = {‘小智‘:‘1002‘,‘info‘:[‘小张‘,‘1006‘,‘man‘]}
st=copy.deepcopy(student)
st[‘小智‘] = ‘1005‘
print(‘更改copy后的st为:‘,st)
print(‘原字符串为:‘,student)
st[‘info‘].remove(‘man‘)
print(‘删除后st为:‘,st)
print(‘删除后student为:‘,student)

C:\python\python.exe C:/python.py/zidian.py

更改copy后的st为: {‘小智‘: ‘1005‘, ‘info‘: [‘小张‘, ‘1006‘, ‘man‘]}

原字符串为: {‘小智‘: ‘1002‘, ‘info‘: [‘小张‘, ‘1006‘, ‘man‘]}

删除后st为: {‘小智‘: ‘1005‘, ‘info‘: [‘小张‘, ‘1006‘]}

删除后student为: {‘小智‘: ‘1002‘, ‘info‘: [‘小张‘, ‘1006‘, ‘man‘]}

深复制,包含对象里面的自对象的复制,所以原始对象的改变不会造成深复制里任何子元素的改变


fromkeys()方法

fromkeys()方法用于创建一个新字典,以序列seq中的元素做字典的键,value为字典所有键对应的初始值

fromkeys()方法语法如下:

          dict.fromkeys(seq[,value])

    dict代表指定字典;eq代表字典键值列表;value代表可选参数,设置键序列(seq)。该方法返回结果为字典。

fromkeys()方法演示:

seq=(‘name‘,‘age‘,‘sex‘)
info = dict.fromkeys(seq)
print(‘新的字典为:%s‘% info)
info =dict.fromkeys(seq,10)
print(‘赋值后的字典为:%s‘%info)

C:\python\python.exe C:/python.py/zidian.py

新的字典为:{‘name‘: None, ‘sex‘: None, ‘age‘: None}

赋值后的字典为:{‘name‘: 10, ‘sex‘: 10, ‘age‘: 10}

fromkeys()方法使用给定位的键建立新字典,每个键默认对应的值为None。


get()方法

get()方法返回指定的键值,如果值不字典中,就返回默认值。

get()方法语法如下:

           dict.get(key,default=None)

     dict代表指定字典;key 代表字典中要查找的键,default代表指定键值不存在时默认值。该方法返回结果为指定的键值,如果值不在字典中,就返回默认值None。   

get()方法演示:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘}
print(‘高爽的学号为:%s‘% student.get(‘高爽‘))
#访问一个不存在的键值
print(‘柴兴旺的学号为:%s‘% student.get(‘柴兴旺‘))

C:\python\python.exe C:/python.py/zidian.py

高爽的学号为:888

柴兴旺的学号为:None

使用get方法访问一个不存在的键时,返回None。可以自定义默认值,用于替换None。

例如:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘}
#访问一个不存在的 键值时将默认返回值None替换为自定的值
print(‘柴兴旺的学号为:%s‘% student.get(‘柴兴旺‘,‘此人不存在!!!‘))

C:\python\python.exe C:/python.py/zidian.py

柴兴旺的学号为:此人不存在!!

从上例可以看出‘此人不存在!!!‘代替了None


key in dict()方法

key in dict()方法python字典in操作符用于判断键是否存在于字典中,如果键在字典dict中就返回true,否则就返回false。

key in dict()方法语法如下:

             key in dict

       dict代表指定字典;key代表要在字典中查找的键。如果键在字典dict中就返回true,否则就返回false。

key in dict()方法演示:
student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘888‘,‘杜兆利‘:‘999‘}
print(‘杜宇恒在student字典中吗?%s‘%(‘杜宇恒‘in student))
print(‘柴兴旺在student字典中吗?%s‘%(‘柴兴旺在‘in student))

C:\python\python.exe C:/python.py/zidian.py

杜宇恒在student字典中吗?True

柴兴旺在student字典中吗?False

注意:在python2中有一个相同功能的方法has_key方法,has_key方法的使用方式和in不同。


items()方法

items()方法以列表返回可遍历的(键,值)元组数组。

items()方法语法如下:

         dict.items() 

         dict代表指定字典;不需要参数。返回结果为可遍历的(键/值)元组数组。

items()方法演示:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘}
print(‘调用items方法的结果:%s‘%student.items())

C:\python\python.exe C:/python.py/zidian.py

调用items方法的结果:dict_items([(‘杜宇恒‘, ‘666‘), (‘徐伟‘, ‘777‘)])

上例可以看出返回结果为一个元组组数。

注意:在python2中提供了一个iteritems方法,和items方法的作用大致相同,但是iteritems方法返回的是一个迭代器对象,而不是列表。在python3没有iteritems方法


keys()方法

keys()方法以列表返回一个字典的所有键。

keys()方法语法如下;

         dict.keys()

   dict代表指定字典;不需要参数。返回结果为一个字典的所有键。

keys()方法演示:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘}
print("student字典中的所有键为:%s"%student.keys())

C:\python\python.exe C:/python.py/zidian.py

student字典中的所有键为:dict_keys([‘杜宇恒‘, ‘徐伟‘])

上例可以看出返回的是一个元组数,数组中包含字典所有键。


setdefault()方法

setdefault()方法和get()方法类似,用于获得与给定键相关联的值。如果键不存在于字典中,就会添加键并将值设为默认值。       

setdefault()方法语法如下:

           dict.setdefault(key.default=None)

dict代表指定字典;key代表查找的键值,default代表不存在时设置的默认键值。该方法没有任何返回值。

setdefault()方法演示:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘}
print(‘高爽的键值为:%s‘%student.setdefault(‘高爽‘))
print(‘徐伟的键值为:%s‘%student.setdefault(‘徐伟‘))
print(‘student字典的型值为:%s‘%student)

C:\python\python.exe C:/python.py/zidian.py

高爽的键值为:None

徐伟的键值为:777

student字典的型值为:{‘徐伟‘: ‘777‘, ‘高爽‘: None, ‘杜宇恒‘: ‘666‘}

上例可以看出,当键不存在时,setdefault()方法返回默认值并更新字典;如果键存在就返回对应的值,不改变字典。

使用setdefault()访问一个不存在的键值时,如果不设定就使用None,如果设定就使用设定的值。

例如:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘}
print(‘高爽的键值为:%s‘%student.setdefault(‘高爽‘))

C:\python\python.exe C:/python.py/zidian.py

高爽的键值为:None

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘}
print(‘高爽的键值为:%s‘%student.setdefault(‘高爽‘,‘888‘))
print(student)

C:\python\python.exe C:/python.py/zidian.py

高爽的键值为:888

{‘高爽‘: ‘888‘, ‘杜宇恒‘: ‘666‘, ‘徐伟‘: ‘777‘}

上列可以看出使用默认值时输出结果为None;设定了键值后便输出了所设定的键值,并且更新了字典。


update方法()方法

update方法()方法用于把字典dict2的键值/值对更新到dict里

update方法()方法语法如下:

            dict.update(dict2)

      dict代表指定字典;dict2代表添加到指定字典dict里的字典。该方法没有任何返回值。

update方法()方法演示:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘}
student2={‘高爽‘:‘888‘}
print(‘原student字典为:%s‘%student)
student.update(student2)
print(‘新student字典为:%s‘%student)
#对相同项覆盖
student3={‘高爽‘:‘1010‘}
student.update(student3)
print(‘覆盖后的新student字典为:%s‘%student)

C:\python\python.exe C:/python.py/zidian.py

原student字典为:{‘杜宇恒‘: ‘666‘, ‘徐伟‘: ‘777‘}

新student字典为:{‘杜宇恒‘: ‘666‘, ‘徐伟‘: ‘777‘, ‘高爽‘: ‘888‘}

覆盖后的新student字典为:{‘杜宇恒‘: ‘666‘, ‘徐伟‘: ‘777‘, ‘高爽‘: ‘1010‘}

由上例可以看出,提供的字典中的项被添加到旧字典中,如果有相同键就会覆盖。


values()方法

values()方法以列表形式返回字典中所有值,与返回键的列表不同,返回列表中可以包含重复的元素。

values()方法语法如下:

          dict.values()

    dict代表指定字典;不需要参数。返回结果为字典中的所有值。

values()方法演示:

student={‘杜宇恒‘:‘666‘,‘徐伟‘:‘777‘,‘高爽‘:‘666‘}
print("student字典所有的值为:%s"%list(student.values()))

C:\python\python.exe C:/python.py/zidian.py

student字典所有的值为:[‘666‘, ‘666‘, ‘888‘]

上例可以看出,返回的列表中包含重复的元素。

 


本文出自 “duyuheng” 博客,谢绝转载!

以上是关于python3.5修炼手册10的主要内容,如果未能解决你的问题,请参考以下文章

python3.5修炼手册1

python3.5修炼手册12

python3.5修炼手册5

python3.5修炼手册11

python3.5修炼手册7

python3.5修炼手册9