#字典 #字典是Python中唯一内建的映射类型。字典中没有特殊的顺序,但都是存储在一个特定的键(key)下面,键可以是数字,字符串,甚至是元组 #一、字典的使用 #在某些情况下,字典比列表更加适用: #1、表示一个游戏棋盘的状态,每个键都是由坐标值组成的元组 #2、存储文件修改时间,用文件名作为键; #3、数字电话\地址薄 #1、使用列表创建一个电话本,(这里用字符串表示电话号码,以0开头的数字回会被编译成8进制数字) name=["A","B","C","D"] phone=["2341","9102","3158","0142","5551"] print(phone[name.index("B")]) #这样做可以,但是不实用 #二、创建和使用字典 #创建一个字典,字典由多个键与其对应的值构建成的键-值对组成,中间由冒号隔开,项之间用逗号隔开,字典由大括号括起来。空字典由{}组成 #字典中的键是唯一的,而值不唯一 phonebook={"Alice":"2431",‘Beth‘:‘9102‘,‘Cecil‘:‘3258‘} #1、dict函数,可以使用dict函数,通过其他映射(比如其他字典)或者(键,值)对的序列建立字典 items=[(‘name‘,‘Gumby‘),(‘age‘,42)] d=dict(items) print(d) print(d[‘name‘]) #dict函数也可以通过关键字参数来创建字典 a=dict(name="CY",num=42) print(a[‘name‘]) #2、基本字典的操作 #大部分操作与序列相似 #返回字典中键值对的数量 print(len(a))
#普通索引 a=dict(name="CY",num=42) print(a["name"]) #给字典中的key赋值 a["name"]="Challenger" print(a) #del 删除key del a["name"] print(a) #使用in来检测字典中key是否存在 print("num" in a) #与列表的不同之处 # 键类型:字典的键类型不一定为整形数据,键可以是任意不可变类型,比如浮点类型(实型)、字符串或者元租 # 自动添加:即使键起初在字典中并不存在,也可以为它赋值,字典就会建立新的项。而(在不使用append方法或者其他类似操作的情况下)不能将值关联到列表范围之外的索引上 # 表达式 key in dictionary,查找的是键,而不是值。表达式 value in list,用来查找值,而不是索引。 #在字典中检查键的成员资格比在列表中检查值的成员资格更高,数据结构规模越大,俩者的效率差距越明显
#字典示例 #一个简单的数据库 #字典使用人名作为键值。每个人用另一个字典来表示,其键‘phone‘和‘addr‘分别表示他们的电话号码和地址 people={ ‘Alice‘:{ ‘phone‘:‘2341‘, ‘addr‘:‘Fpp driver 23‘ }, ‘Beth‘:{ ‘phone‘:‘9102‘, ‘addr‘:‘Bar street 42‘ }, ‘Cecil‘:{ ‘phone‘:"3158", ‘addr‘:‘Baz avenue 90‘ } } #针对电话号码的地址使用的描述性标签,会在打印输出的时候用到 lable={ ‘phone‘:‘phone number‘, ‘addr‘:‘address‘ } name=input(‘Name: ‘) #查找电话号码还是地址? request=input(‘Phone number(p) or address(a)?‘) #使用正确的键值 if request==‘p‘: key=‘phone‘ if request==‘a‘: key=‘addr‘ #如果名字是字典中的有效键值才打印信息 if name in people: print("%s‘s %s is %s."%(name,lable[key],people[name][key]))
#4字典方法 #1、clear方法 #clear方法清除字典中所有的项,这个是原地操作,类似(list.sort)所以无返回值(或者是返回None) d={} d[‘name‘]=‘CY‘ d[‘age‘]=23 print(d) returned_value=d.clear() print(d) print(returned_value) #使用clear的意义是真正清空原来的字典 #情况一,将x关联到一个空字典可以清空x,但是不会影响到y,y还关联原来的字典。 x={} y=x x[‘key‘]=‘value‘ print(y) x={} print(x) print(y) #情况二,使用clear方法可以清空原来的字典 x1={} y1=x1 x1["key"]="value" print(y1) x1.clear() print(x1) print(y1)
#2、copy方法返回一个具有相同键值对的新字典(这个方法实现的是浅复制,因为值本身是相同的,而不是副本),使用copy复制过来的字典,如果替换值时不受影响,如果修改(增,删)值,原始字典也会改变 x={‘username‘:‘admin‘,‘machines‘:[‘foo‘,‘bar‘,‘baz‘]} y=x.copy() y[‘username‘]=‘mlh‘ y[‘machines‘].remove(‘bar‘) print(y) print(x) #避免上述问题,可以使用深复制 deepcopy函数 from copy import deepcopy d={} d[‘name‘]=[‘Alfred‘,‘Bertrand‘] c=d.copy() dc=deepcopy(d) d[‘name‘].append(‘Clive‘) print(c) print(dc) #3、fromkeys方法使用给定的键建立新的字典,每个键都对应一个None print({}.fromkeys([‘name‘,‘age‘])) #以上方法使用空字典,建立另一个字典有些多余,可以直接使用dict方法 print(dict.fromkeys([‘name‘,‘age‘])) #也可以指定默认值 print(dict.fromkeys([‘name‘,‘age‘],‘(unknown)‘)) #4、get方法是很宽松的访问字典的方法,不使用get,访问字典中不存在的项会出错,会返回none d={} print(d.get(‘name‘)) #还可以自定义"默认值" print(d.get(‘name‘,"N/A")) #如果键存在,get使用方法和普通字典查询一样 d[‘name‘]=‘CY‘ print(d.get(‘name‘))
#使用get方法实现电话本的功能 people={ ‘Alice‘:{ ‘phone‘:‘2341‘, ‘addr‘:‘Fpp driver 23‘ }, ‘Beth‘:{ ‘phone‘:‘9102‘, ‘addr‘:‘Bar street 42‘ }, ‘Cecil‘:{ ‘phone‘:"3158", ‘addr‘:‘Baz avenue 90‘ } } lable={ ‘phone‘:‘phone number‘, ‘addr‘:‘address‘ } name=input(‘Name: ‘) request=input(‘Phone number(p) or address(a)?‘) if request==‘p‘: key=‘phone‘ if request==‘a‘: key=‘addr‘ person=people.get(name,{}) lable=lable.get(key,key) result=person.get(key,‘not available‘) print("%s‘s %s is %s."%(name,lable,result))
#5、items #item方法将字典所有的项以列表方式返回,返回时没有特定的次序 # 3.x 里面,iteritems()和viewitems()这两个方法都已经废除了,而items()得到的结果是和2.x里面viewitems()一致的。在3.x里用items()替换iteritems(),可以用于for来循环遍历。 d={‘title‘:‘ppp‘,‘name‘:‘ccc‘} print(d.items()) #6、keys()将字典中的键以列表形式返回 print(d.keys()) #7、pop方法用来获得对应于给定键的值,然后将这个键值对从字典中移除 d1={‘aasd‘:"sadad",‘asdasd‘:"sadsadad"} print(d1.pop(‘aasd‘)) print(d1) #8、popitem #popitem方法类似于list.pop,后者弹出列表最后一个元素。但不同的是,popitem弹出随机的项,因为字典中没有最后的元素,该方法适合一个接一个旳移除并且处理项(不用首先获取键的列表,所以很高效) d2={‘a‘:‘b‘,"c":‘d‘} print(d2.popitem()) print(d2) #9、setdefault #setdefault在某种程度上类似于get,可以获得与给定键相关的值,setdefault还能在字典中不含给定键的情况下设定相应的键值,如果键值存在,不会修改原来的键值 d3={} d3.setdefault(‘name‘,‘None‘) print(d3) d3[‘name‘]=‘CY‘ print(d3.setdefault(‘name‘,‘None‘)) #10、update #update方法可以利用一个字典更新另一个字典,如果键值存在则直接覆盖,如果不存在则会添加 d={‘title‘:‘sasdadadad‘,"url":"asdasdadsad","change":‘asdasdada‘} a={‘title‘:"a"} d.update(a) print(d) #11、values,用于返回当前字典中的值 d={} d[1]=1 d[2]=2 print(d.values())
#字典的格式化字符串 #在每个转换说明符的后面,可以加上键(用括号括起来),后面再加上说明元素 phonebook={‘Beth‘:‘9102‘,‘Alice‘:‘1111‘,‘tom‘:‘1551‘} print("tom‘s phoneNum is %s" % phonebook["tom"]) print("tom‘s phoneNum is %(tom)s" % phonebook) #除了增加的字符串键外,转换说明符还是像以前一样工作。,当以这种方式使用字典的时候,只要所有给出的键都能在字典中找到,就可以使用任意数量的转换说明符。 #这类字符串格式化在模板系统中非常有用 template="""<html> <head><title>%(title)s</title></head> <body> <h1>%(title)s</h1> <p>%(text)s</p> </body> """ data={"title":"My Home Page","text":"Welcome to my home page!"} print(template % data)
原文地址:https://www.cnblogs.com/hankleo/p/10894120.html
时间: 2024-11-13 02:33:56