Python3 字典dictionary入门基础附实例
Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。字典由键和对应值成对组成。字典也被称作关联数组或哈希表。
注意:
1、每个键与值用冒号隔开(:),每对用逗号,每对用逗号分割,整体放在花括号中({})。
2、键必须独一无二,但值则不必。
3、值可以取任何数据类型,但必须是不可变的,如字符串,数或元组。
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中,格式如下所示:
d={key1:value1,key2:value2}
键必须是唯一的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
一个简单的字典实例:
dict={'Alice':'2341','Beth':'9102','Cecil':'3258'}
也可如此创建字典:
dict1={'abc':456}
dict2={'abc':123,98.6:37}
访问字典里的值
把相应的键放入到方括号中,如下实例:
实例
#!/usr/bin/python3 dict={'Name':'jb51.net','Age':13,'Class':'Second'} print("dict['Name']:",dict['Name']) print("dict['Age']:",dict['Age'])
以上实例输出结果:
dict['Name']:jb51.net
dict['Age']:13
如果用字典里没有的键访问数据,会输出错误如下:
#!/usr/bin/python3 dict={'Name':'jb51.net','Age':13,'Class':'Second'} print("dict['Alice']:",dict['Alice'])
以上实例输出结果:
Traceback(mostrecentcalllast):
File"F:\python\test.py",line4,in
print("dict['Alice']:",dict['Alice'])
KeyError:'Alice'
修改字典
向字典添加新内容的方法是增加新的键/值对,修改或删除已有键/值对如下实例:
#!/usr/bin/python3 dict={'Name':'jb51.net','Age':13,'Class':'Second'} dict['Age']=8#更新Age dict['School']="毛票票"#添加信息 print("dict['Age']:",dict['Age']) print('dict["Age"]:',dict['Age']) print("dict['School']:",dict['School'])
以上实例输出结果:
dict['Age']:8
dict["Age"]:8
dict['School']:毛票票
发现了没外面单引号里面就用双引号,外面是双引号里面就用单引号都可以输出
删除字典元素
能删单一的元素也能清空字典,清空只需一项操作。
显示删除一个字典用del命令,如下实例:
#!/usr/bin/python3 dict={'Name':'jb51.net','Age':13,'Class':'Second'} deldict['Name']#删除键'Name' dict.clear()#清空字典 deldict#删除字典 print("dict['Age']:",dict['Age']) print("dict['School']:",dict['School'])
但这会引发一个异常,因为用执行del操作后字典不再存在:
Traceback(mostrecentcalllast):
File"F:\python\test.py",line9,in
print("dict['Age']:",dict['Age'])
TypeError:'type'objectisnotsubscriptable
注:del()方法后面也会讨论。
字典键的特性
字典值可以是任何的python对象,既可以是标准的对象,也可以是用户定义的,但键不行。
两个重要的点需要记住:
1)不允许同一个键出现两次。创建时如果同一个键被赋值两次,后一个值会被记住,如下实例:
#!/usr/bin/python3 dict={'Name':'jb51.net','Age':13,'Name':'毛票票'} print("dict['Name']:",dict['Name'])
以上实例输出结果:
dict['Name']:毛票票
2)键必须不可变,所以可以用数字,字符串或元组充当,而用列表就不行,如下实例:
#!/usr/bin/python3 dict={['Name']:'jb51.net','Age':7} print("dict['Name']:",dict['Name'])
以上实例输出结果:
Traceback(mostrecentcalllast):
File"F:\python\test.py",line2,in
dict={['Name']:'jb51.net','Age':7}
TypeError:unhashabletype:'list'
字典内置函数&方法
Python字典包含了以下内置函数:
序号 | 函数及描述 | 实例 |
---|---|---|
1 | len(dict) 计算字典元素个数,即键的总数。 |
>>>dict={'Name':'jb51.net','Age':13,'Class':'First'} >>>len(dict) 3 |
2 | str(dict) 输出字典,以可打印的字符串表示。 |
>>>dict={'Name':'jb51.net','Age':13,'Class':'First'} >>>str(dict) "{'Name':'jb51.net','Class':'First','Age':13}" |
3 | type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。 |
>>>dict={'Name':'jb51.net','Age':13,'Class':'First'} >>>type(dict) |
cmp(dict1,dict2)#比较两个字典元素。 len(dict)#计算字典元素个数,即键的总数。 str(dict)#输出字典可打印的字符串表示。 type(variable)#返回输入的变量类型,如果变量是字典就返回字典类型。
Python字典包含了以下内置方法:
序号 | 函数及描述 |
---|---|
1 | radiansdict.clear() 删除字典内所有元素 |
2 | radiansdict.copy() 返回一个字典的浅复制 |
3 | radiansdict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值 |
4 | radiansdict.get(key,default=None) 返回指定键的值,如果值不在字典中返回default值 |
5 | keyindict 如果键在字典dict里返回true,否则返回false |
6 | radiansdict.items() 以列表返回可遍历的(键,值)元组数组 |
7 | radiansdict.keys() 返回一个迭代器,可以使用list()来转换为列表 |
8 | radiansdict.setdefault(key,default=None) 和get()类似,但如果键不存在于字典中,将会添加键并将值设为default |
9 | radiansdict.update(dict2) 把字典dict2的键/值对更新到dict里 |
10 | radiansdict.values() 返回一个迭代器,可以使用list()来转换为列表 |
11 | pop(key[,default]) 删除字典给定键key所对应的值,返回值为被删除的值。key值必须给出。否则,返回default值。 |
12 | popitem() 随机返回并删除字典中的最后一对键和值。 |
radiansdict.clear()#删除字典内所有元素 radiansdict.copy()#返回一个字典的浅复制 radiansdict.fromkeys()#创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值 radiansdict.get(key,default=None)#返回指定键的值,如果值不在字典中返回default值 radiansdict.items()#以列表返回可遍历的(键,值)元组数组 radiansdict.keys()#以列表返回一个字典所有的键 radiansdict.setdefault(key,default=None)#和get()类似,但如果键不已经存在于字典中,将会添加键并将值设为default radiansdict.update(dict2)#把字典dict2的键/值对更新到dict里 radiansdict.values()#以列表返回字典中的所有值
下面是一些实例方便大家更好的理解字典的使用
字典的键值是"只读"的,所以不能对键和值分别进行初始化,即以下定义是错的:
>>>dic={} >>>dic.keys=(1,2,3,4,5,6) Traceback(mostrecentcalllast): File"",line1,in AttributeError:'dict'objectattribute'keys'isread-only >>>dic.values=("a","b","c","d","e","f") Traceback(mostrecentcalllast): File" ",line1,in AttributeError:'dict'objectattribute'values'isread-only >>>
字典是支持无限极嵌套的,如下面代码:
cities={ '北京':{ '朝阳':['国贸','CBD','天阶','我爱我家','链接地产'], '海淀':['圆明园','苏州街','中关村','北京大学'], '昌平':['沙河','南口','小汤山',], '怀柔':['桃花','梅花','大山'], '密云':['密云A','密云B','密云C'] }, '河北':{ '石家庄':['石家庄A','石家庄B','石家庄C','石家庄D','石家庄E'], '张家口':['张家口A','张家口B','张家口C'], '承德':['承德A','承德B','承德C','承德D'] } }
可以使用如下方法进行列出
foriincities['北京']:
print(i)
将列出如下结果:
朝阳
海淀
昌平
怀柔
密云
foriincities['北京']['海淀']:
print(i)
输出如下结果:
圆明园
苏州街
中关村
北京大学
用字典记录学生名字和分数,再分级:
#!/usr/bin/python3 students={} write=1 whilewrite: name=str(input('输入名字:')) grade=int(input('输入分数:')) students[str(name)]=grade write=int(input('继续输入?\n1/继续0/退出')) print('namerate'.center(20,'-')) forkey,valueinstudents.items(): ifvalue>=90: print('%s%sA'.center(20,'-')%(key,value)) elif89>value>=60: print('%s%sB'.center(20,'-')%(key,value)) else: print('%s%sC'.center(20,'-')%(key,value))
测试输出结果:
输入名字:a
输入分数:98
继续输入?
1/继续0/退出1
输入名字:b
输入分数:23
继续输入?
1/继续0/退出0
-----namerate-----
------a98A------
------b23C------
字典可以通过以下方法调换key和value,当然要注意原始value的类型,必须是不可变类型:
dic={ 'a':1, 'b':2, 'c':3, } reverse={v:kfork,vindic.items()} print(dic) print(reverse)
输出如下:
{'a':1,'b':2,'c':3}
{1:'a',2:'b',3:'c'}
循环显示字典key与value值:
b={'a':'jb51.net','b':'baidu'} foriinb.values(): print(i) forcinb.keys(): print(c)
执行输出结果为:
jb51.net
baidu
a
b
字典字段的比较
获取字典中最大的值及其键:
prices={ 'A':123, 'B':450.1, 'C':12, 'E':444, } max_prices=max(zip(prices.values(),prices.keys())) print(max_prices)#(450.1,'B')
Python3.x中会碰到这样的问题:
>>>sites_link={'jb51':'jb51.net','baidu':'baidu.com'} >>>sides=sites_link.keys() >>>print(sides[0]) Traceback(mostrecentcalllast): File"",line1,in TypeError:'dict_keys'objectdoesnotsupportindexing >>>
原因说明及解决方法:
dict.values()
dict.keys()
在python2.xdict.keys返回一个列表,但是在在Python3.x下,dict.keys返回的是dict_keys对象,若需要转换为列表,请使用:
list(dict.values())
list(dict.keys())
修改上面实例:
>>>sites_link={'jb51':'jb51.net','baidu':'baidu.com'} >>>sides=sites_link.keys() >>>list(sides) ['jb51,'baidu'] >>>
通过values取到key的方法:
>>>dic={"a":1,"b":2,"c":3} >>>list(dic.keys())[list(dic.values()).index(1)] 'a'
字典列表,即在列表中嵌套字典:
dict_0={'color':'green','points':5} dict_1={'color':'yellow','points':10} dict_2={'color':'red','points':15} lists=[dict_0,dict_1,dict_2] fordictinlists: print(dict)
输出:
{'color':'green','points':5}
{'color':'yellow','points':10}
{'color':'red','points':15}
字典推导式:
格式:
{key:valueforvariableiniterable[ifexpression]}
执行步骤:
1、for循环:遍历可迭代对象,将其值赋给变量。
2、if语句:筛选满足if条件的结果。
3、存储结构:以键值对的方式存储在字典中。