# -*- coding: utf-8 -*- # ==================== #File: python #Author: python #Date: 2014 #==================== __author__ = ‘Administrator‘ #dict{键:值} #哈希 #注:字典是无顺序的,所以你懂的 #创建与赋值 dict1={} dict2={‘name‘:‘apply‘,‘avg‘:24,‘sex‘:‘man‘} print dict1,dict2 #从2.2开始,可以使用内建dict创建字典 fdict=dict(([‘x‘,1],[‘y‘,2])) print fdict #2.3开始,可以使用fromkeys()创建一个默认的字典,如果未给出,则显示None ddict={}.fromkeys((‘x‘,‘y‘),-1) print ddict ddict={}.fromkeys((‘x‘,‘y‘)) print ddict #如何访问字典值 for keys in dict2.keys(): print ‘keys=%s,value=%s‘%(keys,dict2[keys]) #想得到字典中某个元素值,可以使用dict[key]方法 print dict2[‘name‘] #或者使用for遍历 print ‘name=%s and avg=%d and sex=%s‘%\ (dict2[‘name‘],dict2[‘avg‘],dict2[‘sex‘]) #当访问一个未存在的值,会出现错误:KEYERROR错误 #检查字典中元素是否存在:has_key() in not in print ‘name‘ in dict2 print dict2.has_key(‘name‘) print dict2.has_key(‘apply‘) #混合数字和字典串 dict3={} dict3[1]=‘abcd‘ dict3[‘1‘]=3.14 dict3[3.2]=‘xyz123‘ print dict3 #如何更新字典 dict2[‘name‘]=‘dog‘#更新 dict2[‘avg‘]=30 print dict2 dict2[‘xl‘]=‘dz‘#增加元素 print dict2 #字典格式化 print u‘我叫:%(name)s,年龄:%(avg)d‘%(dict2) #如何删除字典及元素 del dict2[‘name‘]#删除指定元素:name dict2.pop(‘avg‘)#删除并返回键了‘w‘的条目 dict2.clear()#删除dict2所有内容 del dict2#删除整个 #操作符:<,>,<=,>=,==,!=,<>,and,not,or #d[k]=v表示键k给字典中某元素赋值v #d[k]查找k,比较操作符:in,not in #内建函数和工厂函数 print type(dict1) print str(dict1) #字典中的比较算法(高级) dict1={} dict2={‘name‘:‘apply‘,‘avg‘:24,‘sex‘:‘man‘} print cmp(dict1,dict2) dict1[‘name‘]=‘apply‘ print cmp(dict1,dict2) dict1[‘avg‘]=24 dict1[‘sex1‘]=‘module‘ print cmp(dict1,dict2) #字典中的算法比较顺序 #比较字典的长度 #如果长度不相同,那么cmp(a,b)比较时,如果a大于b时,返回1,如果a<b时,返回-1,也就是说,字典中的数量越多,字典就越大 #len(a)>len(b)==>a>b #比较字典的键 #当字典中的长度一样时,那么按它的键比较,键比较顺序和keys()方法一样 # (注意:相同的键会映射到哈希表同一位置,保证对字典键检查一致性),如果字典键不匹配时,对这2个(不匹配的键)直接比较,当第一个不同的键大于第2个时,cmp()返回正值 # 比较字典的值 #当字典的长度一样,键也匹配时,则对字典中每个相同的键对应的值进行比较,一旦出现不匹配的值,就直接比较,结果同上面 #完全匹配 #如果前3点都相同,那么就说明是完全匹配,返回的是0 #相关函数 #dict() print dict(zip((‘x‘,‘y‘),(1,2))) print dict([[‘x‘,1],[‘y‘,2]]) print dict([(‘xy‘[i-1],i)for i in range(1,3)]) #2.3开始dict)方法可以接受字典或者关键字参数字典 print dict(x=11,y=2) dict8=dict(x=11,y=2,c=4) dict9=dict(**dict8)#不建议这样的使用 print dict9 #更聪明的方法 dict9=dict8.copy() print dict9 #len() print len(dict2) #hash():判断某个对象是否可以做字典的键 #help(hash)#hash(object) -> integer #如果出错:typeerror #映射内建方法 print dict2.keys()#返回一个列表,包含字典中所有的键 print dict2.values()#返回一个列表,包含字典中所有的值 print dict2.items()#返回一个列表,包含字典中所有的键与值 print for i in dict2.keys(): print i,dict2[i]#遍历 #排序 print u‘排序‘ for px in sorted(dict2,reverse=True): print px ,dict2[px] #update()将一个字典内容添加到另一个字典中 #如果旧的键和新添加的键重复,那么会被新键覆盖 print ‘update‘ ditc31={‘year‘:2014} dict2.update(ditc31) print dict2 print u‘删除‘ dict3.clear() #当使用了clear()方法时,会返回空字典 print dict3 #copy()复制 print u‘复制‘ dict4=dict2.copy() print dict4 #get()查找字典中key,返回对应的value,如果不存在此key,则返回default值,注意:default默认为None print dict4.get(‘avg‘) print dict4.get(‘2013‘) print dict4.get(‘222‘,‘none1‘) #setdefault():检查中是否含有某个键,如果存在,就可以取它的值,如果未存在,就可以设置成默认值并返回 print dict4.setdefault(‘avg‘,24) print dict4.setdefault(‘year2‘,‘none2‘) #fromkeys() print {}.fromkeys(‘xyz‘) print {}.fromkeys(‘xyz‘,123)#print {}.fromkeys((‘xyz‘),123) #字典的键 #不允许一个键对应多个值 print u‘不允许一个键对应多个值‘ print ‘ ‘ doct1={‘foo‘:1231,‘foo‘:‘xyz‘} print doct1 doct1[‘foo‘]=1234 print doct1 #键必须是可哈希的 #所有不可变的都可哈希,因此它们都可以作为字典的键,也就是说:值相同的数字,表示相同的键,简单说来:1和1.0哈希值是相同的,那么它们的键也相同 #同时也有一些可变的对象(很少)的可哈希的,可以使用__hash()__方法返回一个整形 #为什么键必须可只希的呢?因为解释器调用哈希函数,根据字典中键的值来计算存储你的数据,如果键可变对象,值也改变,如果键变化,哈希函数会映射到不同的地址来存储数据 #如果这样的情况发生,哈希函数不可能可靠的存储或者获取相关的数据 #例子:登录用户名和密码管理系统 db={}#字典 def newuser():#建立新用户名,检查名字是否存在 prompt=‘login desired:‘ while True: name=raw_input(prompt) if name in db.keys():#or db.has_key(name) prompt=‘name taken,try,another‘ continue else: break pwd=raw_input(‘password:‘) db[name]=pwd def oldshow():#处理函数部分 name=raw_input(‘login:‘) pwd=raw_input(‘password:‘) password=db.get(name) if password==pwd: print u‘登录:%s‘%(name) else: print u‘登录失败‘ def showmen(): prompt=‘‘‘ (N)ew user login (E)xisting user login (Q)uit enter chice‘‘‘ done=False while not done: chose=False while not chose: try: choice=raw_input(prompt).strip()[0].lower() except(EOFError,KeyboardInterrupt): choice=‘q‘ print ‘\nyou picked:[%s]‘%(choice) if choice not in ‘neq‘: print ‘invalid option,try,argin‘ else: choice=True if choice==‘q‘: done=True break if choice==‘n‘: newuser() if choice==‘e‘: oldshow()
#集合类型(set) #支持in ,not in,len(),for循环,无法使用索引或者切片 #两种:可变set),不可变(frozenset) #可变的:增加,删除 #不可变:相反 #2.3版本中,通过集合模块来创建,并通过ImmutableSet类和Set类进行访问 #集合符号 python符号 说明 #∈ in 是 #∉ not in 不是 #= == 等于 #≠ != or <> 不等于 #⊂ < 是。。。。的(严格)的子集 #⊆ <= 是。。。。的子集(包括非严格子集) #⊃ > 是。。。。的(严格)超集 #⊇ >= 是。。。。的超集(包括非严格超集) #∩ & 交集 #∪ | 并集 # -或者\ - 补差或者相对补差 # ▲ ^ 对称差分
#如何创建集合类型和赋值 s=set(‘cheeseshop‘)#可变 print s t=frozenset(‘BOOKSHOP‘)#不可变 print t print type(s) print type(t) print len(s),len(t) print len(s)==len(t) print s==t #访问集合中的值 #使用for遍历或者in,not in print ‘c‘in s print ‘B‘ not in t for s1 in s: print s1 #如果更新集合 s.add(‘2‘) print s s.update(‘pypy1‘) print s #如何删除,直接使用del s #集合类型操作符 #in ,not in s=set(‘cheeseshop‘) print ‘k‘in s print ‘k‘in t print ‘c‘ not in t #集合等价/不等价 #用于在相同或者不同的集合之间做比较,2个集合相等的时:对于每个集合而言,当且仅当其中一个集合中的每个成员也是同一个集合的成员 #也就是说每个集合必须是另一个集合的一个子集,即s<=t和s>=t,均为True或者(s<=t and s>=t) #集合等价/不等价的类型或者集合成员的顺序无关,只和集合元素有关 print s==t print s!=t u=frozenset(s) print s==u print set(‘posh‘)==set(‘shop‘) #子集/超集 """ 大于,小于意味着2个集合在比较时不能相通,等于号允许非严格定义子集和超集 set支持严格(<)子集和非严格(<=)子集,也支持严格(>)超集和非严格(>=)超集,只有当第1个集合是第2个集合的严格子集时,才称第1个集合<第2个集合,反之,第1个是第2个的集合 """ print set(‘shop‘)<set(‘cheeseshop‘)#严格子集 print print set(‘bookshop‘)>=set(‘shop‘)#非严格超集
#集合类型操作符(所有集合类型) print u‘联合|:联合(union)操作与集合的OR操作其实等价的,联合符号有个等价的方法,union()。‘ print s|t #交集(&):与集合AND等价,交集符号的等价方法是intersection() print s&t #查补(-):等价方法是difference() print s-t #对称差分(^):对称差分是集合的XOR(‘异或’),取得的元素属于s1,s2但不同时属于s1和s2.其等价方法symmetric_difference() print s^t #注意:集合之间and,or """ >>> s1 and s2 set([‘a‘, ‘m‘, ‘n‘]) #取 s2 >>> s1 or s2 set([‘i‘, ‘b‘, ‘e‘, ‘g‘, ‘n‘]) #取 s1 >>> """ #前面 的S是可变的集合,t是不可变集合,虽然存在t,但结果还是可变集合 #相反就结果不一样 #如果左右2个操作数类型是相同,即都是可变或者不可变,则产生结果是相同的,但如果左右2个操作数类型是不相同(左边是set),右边是 # (右边是frozenset),或者相反情况,则产生的结果类型与左操作数类型相同,注意:加号不是集合类型的操作符 # 如果s+t则出现一个typeerror错误 #只支持可变集合操作符 #(uion):update(|=) #这个更新方法从已《存在》的集合中添加(可能多个)的成员,与update()等价 print u‘update‘ u=frozenset(s) s.update(set(‘pypi‘))#s|=set(‘pypi‘) print s #retention/intersection update(&=):保留(或者次更新)操作保留与其他集合共有成员,与intersection_update()等价 s=set(u) s&=set(‘shop‘) print s #defference update(-=):对集合s与t进行差更新的操作s-=t,返回一个集合,该集合成员是集合s去除集合t元素中剩余元素,与differebce_update()等价 s-=set(‘shop‘) print s #symmetric defference update(^=)#对集合s和t进行对称差更新操作(s^=t),返回一个操作,该集合中的成员仅是原集合s或者仅是另一个集合t的成员,与symmetric_defference_update()等价 t=frozenset(‘bookshop‘) s^=t print s #集合内建函数 #len(),set(),froxenset() """set(),froxenset() 如果未提供任何参数,默认会生成一个集合,如果提供一个,则该参数必须是可迭代的,即一个序列或者迭代器,或者支持迭代的一个对象,比如文件或者字典 """ print set() print set([])
print set({}) print set(‘shop‘) print frozenset([‘dog‘,‘cat‘]) f=open(‘a.txt‘,‘w‘) for i in range(5): f.write(‘%d‘%(i))
f.close() f=open(‘a.txt‘) print set(f)
python基础学习05(核心编程第二版)部分,布布扣,bubuko.com