Python 字典
字典是一种通过名字引用值的数据结构。这种结构类型称为映射。字典是Python中唯一内建的映射类型 字典中的值并没有特殊的顺序,都存储在一个特定的键(Key)里,键可以是数字、字符串甚至是元组 1.创建 使用dict函数,通过其他映射(比如其他字典)或者(键、值)这样的序列对建立字典 ? ?也可以通过关键字参数来创建字典 ? 2.基本字典操作 字典的基本行为在许多方面与序列类似: len(d) 返回d中项(键-值对)的数量 d[k] 返回关联到键k上的值 d[k]=v 将值v关联到键k上 del(d[k]) 删除键为k的项 k in d 检查d中是否含有键为k的项 但也有下面一些重要的区别 键类型:字典的键不一定为整型数据,也可能是其他不可变类型,比如浮点型,字符串或者元组 自动添加:即使那个键起初在字典中并不存在,也可以为它分配一个 值,这一字典就会建立新的项,而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上 成员资格:表达式k in d(d为字典)查找的是键,不是键值,表达式v in l(l为列表)则用来查找值,而不是索引 1 people = { 2 ‘Alice‘: { 3 ‘phone‘: ‘2341‘, 4 ‘addr‘: ‘Foo drive 23‘ 5 }, 6 7 ‘Beth‘: { 8 ‘phone‘: ‘9102‘, 9 ‘addr‘: ‘Bar street 42‘ 10 },11 12 ‘Cecil‘: { 13 ‘phone‘: ‘3158‘,14 ‘addr‘: ‘Baz avenue 90‘ 15 } 16 } 17 18 labels = { 19 ‘phone‘: ‘phone number‘,20 ‘addr‘: ‘address‘ 21 } 22 23 name = input(‘Name: ‘) 24 request = input(‘Phone number (p) or address (a)? ‘) 25 26 if request == ‘p‘: key = ‘phone‘ 27 if request == ‘a‘: key = ‘addr‘ 28 29 if name in people: print("%s‘s %s is %s." % (name,labels[key],people[name][key])) 3.字典的格式化字符串 ?使用字典而不是元组来做这个工作时,在每个转换说明符中的%字符后面,可以加上(圆括号括起来的)键,后面再跟上其他的说明元素 除了增加的字符串键之外,转换说明符还是像之前一样 以这种方式使用字典的时候,只要给出的键在字典中找到,就可以获得任意数量的转换说明符,这类字符串格式化在模板系统中非常有用 1 template = ‘‘‘<html> 2 <head><title>%(title)s</title></head> 3 <body> 4 <h1>%(title)s</h1> 5 <p>%(text)s</p> 6 </body>‘‘‘ 7 8 data = {‘title‘: ‘My Home Page‘,‘text‘: ‘Welcome to my home page!‘} 9 print(template % data) 4.字典方法 clear() 清除字典中的所有项,这个方法无返回值(返回None) 考察以下两种情况 两种情况中,x和y最初对应同一个字典。情况1中,通过将x关联到一个新的空字典来”清空“它,这对y一点影响都也没有,它还关联到原先的字典。 但如果真的想清空原始字典中的所有元素,必须使用clear方法 ? copy() 返回一个具有相同键-值对的新字典(这个方法实现的是浅复制,因为值本身就是相同的,而不是 副本) ? ? ?副本中替换值的时候,原始字典不受影响,但是如果修改了某个值(原地修改,而不是替换)原始的字典也会改变,因为同样的值也存储在原字典中 可以使用深复制来避免这一问题,复制其包含的所有值,可以使用copy模块的deepcopy函数来完成操作 ? ? fromkeys() 使用给定的键建立新的字典,每个键默认对应的值为None ?也可以直接在所有字典的类型dict上面调用方法 ?也可以自己提供默认值 ? get() 一种更宽松的访问字典项的方法,一般来说,在试图访问字典中不存在的项时会出错,但是在使用get()时就不会 ?当使用get()访问一个不存在的键时,没有任何异常,得到了None值,还可以自己定义”默认”值,来替换None;如果键存在,get()用起来就像普通的字典查询一样 get()可以使得程序在用户输入未准备的值时也能做出合理的反应,下面是电话簿程序使用get()方法的版本 1 people = { 2 ‘Alice‘: { 3 ‘phone‘: ‘2341‘,20 ‘addr‘: ‘address‘ 21 } 22 23 name = input(‘Name: ‘) 24 request = input(‘Phone number (p) or address (a)? ‘) 25 26 key = request 27 if request == ‘p‘: key = ‘phone‘ 28 if request == ‘a‘: key = ‘addr‘ 29 30 person = people.get(name,{}) 31 label = labels.get(key,key) 32 result = person.get(key,‘not available‘) 33 34 35 print("%s‘s %s is %s." % (name,label,result)) ? ? has_key 与k in d 是一样的,python3中不包括这个函数 ? items() 以列表形式返回可遍历的(键,值) 元组数组 keys() 以列表形式返回字典中的键 values() 以列表形式返回字典中的值 ? ? setdefault() 类似get()方法,能够获得与给定键相关联的值 ? ?当键不存在的时候,setdefault()返回默认值并且相应地更新字典。如果键存在,那么就返回与其对应的值,但不改变字典 默认值是可选的,如果不设定,就默认使用None ? ? pop() 用来获得给定键的值,然后将这个键-值对从字典中移除 ? ? popitem() 弹出字典中最末尾的项,在希望一个接一个地移除并处理项时,很有用(因为不用首先获取键的列表)? ? ?如果字典已经为空,而使用了此方法,会报出KeyError异常 ? update() update()可以利用一个字典项更新另外一个字典 ? ?提供的字典中的项会被添加到旧的字典中,若有相同的键则会进行覆盖 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |