Dictionary(后文称Dict)如其词义所描述的字典一样,它是一个用于储存键-值对的数据结构。对于C++程序员而言并不陌生,相当于C++中的std::map。在这篇文章中,我们将说明Dict的常用操作。
一 创建一个dict
假设我们需要存储一个用户信息,它包含了以下几个信息:
1) 一个字符串类型的用户ID:uId
2) 根据用户密码计算的MD5串:password
3) 一个用户昵称: nickName
4) 用户的性别,用数字0和1分表表示男性和女性:sex
5) 用户的权限ID,用数字0~3表示从高到低的4个权限等级:privelgeLevel
现在我们可以通过一个Dict来存放这些用户信息:
# -*- coding: UTF-8 -*-
# python.exe
def testDict():
dictUserX = {
"uId":"201708301011",
"password":"AF0852A2154C22D9932B",
"nickName":"UserX",
"sex":0,
"privelgeLevel":3} #(1)
print "user id is:",dictUserX["uId"] #(2)
sex = "Female"
if dictUserX["sex"] == 0:
sex = "Male"
print "sex:",sex
#print dictUserX["1"]
if __name__ == "__main__":
testDict()
结果为:
user id is: 201708301011
sex: Male
#(1) dict的格式为{ 键1:值1,键2:值2 }。
这里采用了分行。关于分行和格式化的一个准则是:在小括号,中括号和大括号中的表达式,可以不使用”\”分行(当然使用也可,这个需要视代码风格而定)。
Dict的值可以为任意一种类型,包括对象、list和dict。但是Key的类型收到严格的限制,它必需是不可更改的类型。例如字符串常量、数字、tuple等。
#(2)和C++的map一样,Python通过KEY可以访问一个值。但不同的是在C++中如果没有这个KEY不会出错,但是Python则会提示KEY找不到的错误。
Traceback (most recent call last):
File "C:/Users/fanduoduo/PycharmProjects/InterestingPython/InterestingPython_dict_1.py", line 21, in <module>
testDict()
File "C:/Users/fanduoduo/PycharmProjects/InterestingPython/InterestingPython_dict_1.py", line 18, in testDict
print dictUserX["1"]
KeyError: '1'
二 遍历dict
下面时使用 for循环遍历一个dict的键值的示例.
# -*- coding: UTF-8 -*-
# python.exe
def testDict():
dictUserX = {
"uId":"201708301011",
"password":"AF0852A2154C22D9932B",
"nickName":"UserX",
"sex":0,
"privelgeLevel":3}
print u"打印所有的键:"
for k in dictUserX.keys():
print k
print u"打印所有的值:"
for v in dictUserX.values():
print v
print u"打印所有的键值对:"
for k,v in dictUserX.items(): #(1)
print k,":",v
print u"键值数量:"
print len(dictUserX)
print u"确认键'uId'是否在dict中:", "uId" in dictUserX.keys()
print u"确认键'hello'是否在dict中:'","hello" in dictUserX.keys()
if __name__ == "__main__":
testDict()
结果为:
打印所有的键:
privelgeLevel
password
nickName
uId
sex
打印所有的值:
3
AF0852A2154C22D9932B
UserX
201708301011
0
打印所有的键值对:
privelgeLevel : 3
password : AF0852A2154C22D9932B
nickName : UserX
uId : 201708301011
sex : 0
键值数量:
5
确认键'uId'是否在dict中: True
确认键'hello'是否在dict中:' False
#(1) 在示例中dict.keys() 返回一个访问dict键的迭代器,dict.values()返回一个访问dict值的迭代器,dict.items() 返回的是一个键-值对。
使用in操作可以确定一个键是否在dict中,以避免按键取值时发生错误。
注意dict是无顺序的,在上面的例子中我们定义的顺序是:uID、password、nickName、sex、privelgeLevel,而实际打印出来的顺序是错乱的。
严格的说我们不能对一个dict排序,但是当需要按某种顺序打印键、值或者键值对内容时可以通过使用python的方法sortd可以把dict.keys,dict.values,dict.items转换为list进行排序,如下示例:
# -*- coding: UTF-8 -*-
# python.exe
def testDict():
dictUserX = {
"uId":"201708301011",
"password":"AF0852A2154C22D9932B",
"nickName":"UserX",
"sex":0,
"privelgeLevel":3}
print u"打印dictUserX:"
print dictUserX
print u"增加一个字段RealName:"
dictUserX["RealName"] = "Jonh"
print dictUserX
print u"修改RealName:"
dictUserX["RealName"] = "John"
print dictUserX
print u"移除RealName:"
del dictUserX["RealName"]
print dictUserX
print u"清空dictUserX:"
dictUserX.clear()
print dictUserX
if __name__ == "__main__":
testDict()
结果为:
原始内容:
{'privelgeLevel': 3, 'password': 'AF0852A2154C22D9932B', 'nickName': 'UserX', 'uId': '201708301011', 'sex': 0}
使用sorted默认排序:
[('nickName', 'UserX'), ('password', 'AF0852A2154C22D9932B'), ('privelgeLevel', 3), ('sex', 0), ('uId', '201708301011')]
nickName : UserX
password : AF0852A2154C22D9932B
privelgeLevel : 3
sex : 0
uId : 201708301011
使用dict.items.sort,反向排序:
[('uId', '201708301011'), ('sex', 0), ('privelgeLevel', 3), ('password', 'AF0852A2154C22D9932B'), ('nickName', 'UserX')]
uId : 201708301011
sex : 0
privelgeLevel : 3
password : AF0852A2154C22D9932B
nickName : UserX
三 更新、增加、删除dict中的元素
使用dict[key]=value增加和更新一个dict的键值,使用del方法删除一个dict中的键值对,使用clear方法清空一个dict。
# -*- coding: UTF-8 -*-
# python.exe
def testDict():
dictUserX = {
"uId":"201708301011",
"password":"AF0852A2154C22D9932B",
"nickName":"UserX",
"sex":0,
"privelgeLevel":3}
print u"原始内容:"
print dictUserX
print u"使用sorted默认排序:"
dictUserX1 = sorted(dictUserX.items())
print dictUserX1
for k,v in dictUserX1:
print k ,":",v
print u"使用dict.items.sort,反向排序:"
listUserX2Items = dictUserX.items()
listUserX2Items.sort(reverse=True)
print listUserX2Items
for k,v in listUserX2Items:
print k ,":",v
if __name__ == "__main__":
testDict()
结果为:
打印dictUserX:
{'privelgeLevel': 3, 'password': 'AF0852A2154C22D9932B', 'nickName': 'UserX', 'uId': '201708301011', 'sex': 0}
增加一个字段RealName:
{'uId': '201708301011', 'sex': 0, 'privelgeLevel': 3, 'password': 'AF0852A2154C22D9932B', 'nickName': 'UserX', 'RealName': 'Jonh'}
修改RealName:
{'uId': '201708301011', 'sex': 0, 'privelgeLevel': 3, 'password': 'AF0852A2154C22D9932B', 'nickName': 'UserX', 'RealName': 'John'}
移除RealName:
{'uId': '201708301011', 'sex': 0, 'privelgeLevel': 3, 'password': 'AF0852A2154C22D9932B', 'nickName': 'UserX'}
清空dictUserX:
{}