python笔记dict篇

来源:互联网 发布:如何安装php开发环境 编辑:程序博客网 时间:2024/05/17 09:10

Dictionary(后文称Dict)如其词义所描述的字典一样,它是一个用于储存键-值对的数据结构。对于C++程序员而言并不陌生,相当于C++中的std::map。在这篇文章中,我们将说明Dict的常用操作。

创建一个dict

假设我们需要存储一个用户信息,它包含了以下几个信息:

1) 一个字符串类型的用户IDuId

2) 根据用户密码计算的MD5串:password

3) 一个用户昵称: nickName

4) 用户的性别,用数字01分表表示男性和女性:sex

5) 用户的权限ID,用数字0~3表示从高到低的4个权限等级:privelgeLevel

现在我们可以通过一个Dict来存放这些用户信息:

 

# -*- coding: UTF-8 -*-# python.exedef 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的值可以为任意一种类型,包括对象、listdict。但是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.exedef 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是无顺序的,在上面的例子中我们定义的顺序是:uIDpasswordnickNamesexprivelgeLevel,而实际打印出来的顺序是错乱的。

严格的说我们不能对一个dict排序,但是当需要按某种顺序打印键、值或者键值对内容时可以通过使用python的方法sortd可以把dict.keys,dict.values,dict.items转换为list进行排序,如下示例:

 

# -*- coding: UTF-8 -*-# python.exedef 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 dictUserXif __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.exedef 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 ,":",vif __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:

{}