Dave Python 练习九 -- 集合




#encoding=utf-8 #*************** 集合类型 ******************** #*********** Part 1: 集合 *********************** #数学上, 把set 称做由不同的元素组成的集合,集合(set)的成员通常被称做集合元素(set #elements)。Python 把这个概念引入到它的集合类型对象里。集合对象是一组无序排列的可哈希的值。 #是的,集合成员可以做字典中的键。数学集合转为Python 的集合对象很有效,集合关系测试和union、 #intersection 等操作符在Python 里也同样如我们所预想地那样工作。 # #和其他容器类型一样,集合支持用 in 和 not in 操作符检查成员, 由 len() 内建函数得到集 #合的基数(大小), 用for 循环迭代集合的成员。但是因为集合本身是无序的,你不可以为集合创建 #索引或执行切片(slice)操作,也没有键(keys)可用来获取集合中元素的值。 # #集合(sets)有两种不同的类型,可变集合(set) 和 不可变集合(frozenset)。如你所想,对可 #变集合(set),你可以添加和删除元素,对 不可变集合(frozenset)则不允许这样做。请注意,可变 #集合(set)不是可哈希的,因此既不能用做字典的键也不能做其他集合中的元素。不可变集合 #(frozenset)则正好相反,即,他们有哈希值,能被用做字典的键或是作为集合中的一个成员。 #创建集合类型和赋值 #集合与列表( [ ] )和字典( { } ) 不同,没有特别的语法格式。列表和字典可以分别用他们自 #己的工厂方法 list() 和 dict() 创建,这也是集合被创建的唯一方法 - 用集合的工厂方法 set()和 frozenset(): #s = set('cheeseshop') #print(s) #t = frozenset('bookshop') #print(t) #print(type(s)) #print(type(t)) #print('s: %s, t:%s ' %(len(s),len(t))) #--> #{'c', 'e', 'h', 'o', 'p', 's'} #frozenset({'b', 'h', 'k', 'o', 'p', 's'}) #<class 'set'> #<class 'frozenset'> #s: 6, t:6 #访问集合中的值 #你可以遍历查看集合成员或检查某项元素是否是一个集合中的成员: #s = set('Dave is DBA') #t = frozenset('Dave come from anqing') #for i in s: # print(i) #--> #a # #B #e #D #i #s #A #v #--注意这里是无序的 #print('l' in s) #print('l' in t) #--> #False #False #更新集合 #用各种集合内建的方法和操作符添加和删除集合的成员: #s = set('Dave is DBA') #t = frozenset('Dave come from anqing') # #s.add('Oracle') #print(s) #-->{'a', ' ', 'B', 'e', 'D', 'i', 's', 'A', 'v', 'Oracle'} # #s.update('China') #print(s) #-->{'a', ' ', 'C', 'B', 'e', 'D', 'i', 'h', 'n', 's', 'A', 'v', 'Oracle'} #--通过这个,我们可以看出add 和 update的区别, add 把内容作为一个元素添加进去, #--而updte 是把内容分别放进去 # #s.remove('D') #print(s) #-->{'a', ' ', 'C', 'B', 'e', 'i', 'h', 'n', 's', 'A', 'v', 'Oracle'} # #s -=set('China') #print(s) #-->{' ', 'B', 'e', 's', 'A', 'v', 'Oracle'} #--这个是集合的相减操作 #只有可变集合能被修改。试图修改不可变集合会引发异常。 #t.add('Dave') #--> #AttributeError: 'frozenset' object has no attribute 'add' #删除集合中的成员和集合 #删除集合本身,可以像删除任何Python 对象一样,令集合超出它的作用范围,或调用del 将他们直接清除出当前的名字空间。 #如果它的引用计数为零,也会被标记以便被垃圾回收。 # del s #**************** Part 2: 集合类型操作符 ********************** ###############标准类型操作符(所有的集合类型) #成员关系 (in, not in) #就序列而言,Python 中的in 和not in 操作符决定某个元素是否是一个集合中的成员。 #s = set('Dave is DBA') #t = frozenset('Dave come from anqing') # #print('D' in s) #print('D' not in s) #--> #True #False #集合等价/不等价 #等价/不等价被用于在相同或不同的集合之间做比较。两个集合相等是指,对每个集合而言,当 #且仅当其中一个集合中的每个成员同时也是另一个集合中的成员。 #你也可以说每个集合必须是另一个集合的一个子集, 即,s <= t 和 s >= t 的值均为真(True), #或(s <= t and s>= t) 的值为真(True)。集合等价/不等价与集合的类型或集合成员的顺序无关, #只与集合的元素有关。 #s=set('Dave come from anqing') #s1=set('Dave') #print(s==s1) #-->False #子集/超集 #Sets 用Python 的比较操作符检查某集合是否是其他集合的超集或子集。“小于”符号( <, <= ) #用来判断子集,“大于”符号( >, >= )用来判断超集。 #print(s1<s) #--> #True ###############集合类型操作符(所有的集合类型) #联合( | ) #联合(union)操作和集合的OR(又称可兼析取(inclusive disjunction))其实是等价的,两个集 #合的联合是一个新集合,该集合中的每个元素都至少是其中一个集合的成员,即,属于两个集合其 #中之一的成员。联合符号有一个等价的方法,union(). #s=set('Dave come from anqing') #s1=set('Dave') #print(s|s1) #--> #{'a', ' ', 'c', 'e', 'D', 'g', 'f', 'i', 'm', 'o', 'n', 'q', 'r', 'v'} #交集( & ) #你可以把交集操作比做集合的AND(或合取)操作。两个集合的交集是一个新集合,该集合中的每 #个元素同时是两个集合中的成员,即,属于两个集合的成员。交集符号有一个等价的方法,intersection(). #print(s&s1) #-->{'a', 'e', 'D', 'v'} #差补/相对补集( – ) #两个集合(s 和t)的差补或相对补集是指一个集合C,该集合中的元素,只属于集合s,而不属 #于集合t。差符号有一个等价的方法,difference(). #print(s-s1) #-->{' ', 'c', 'g', 'f', 'i', 'm', 'o', 'n', 'q', 'r'} #对称差分( ^ ) #和其他的布尔集合操作相似,对称差分是集合的XOR(又称”异或“ (exclusive disjunction)). #两个集合(s 和t)的对称差分是指另外一个集合C,该集合中的元素,只能是属于集合s 或者集合t #的成员,不能同时属于两个集合。对称差分有一个等价的方法,symmetric_difference(). #print(s^s1) #-->{' ', 'c', 'g', 'f', 'i', 'm', 'o', 'n', 'q', 'r'} ###############集合类型操作符(仅适用于可变集合) #(Union) Update ( |= ) #这个更新方法从已存在的集合中添加(可能多个)成员,此方法和update()等价. #s=set('David') #s1=set('Dai') #s|=s1 #print(s) #-->{'a', 'D', 'i', 'v', 'd'} #保留/交集更新( &= ) #保留(或交集更新)操作保留与其他集合的共有成员。此方法和intersection_update()等价. #s&=s1 #print(s) #-->{'a', 'i', 'D'} #差更新 ( –= ) #对集合s 和t 进行差更新操作s-=t,差更新操作会返回一个集合,该集合中的成员是集合s 去 #除掉集合t 中元素后剩余的元素。此方法和difference_update()等价. #s-=s1 #print(s) #-->{'d', 'v'} #对称差分更新( ^= ) #对集合s 和t 进行对称差分更新操作(s^=t),对称差分更新操作会返回一个集合,该集合中的成 #员仅是原集合s 或仅是另一集合t 中的成员。此方法和symmetric_difference_update()等价. #s^=s1 #print(s) #-->{'d', 'v'} #**************** Part 3: 内建函数 ********************** ################标准类型函数 #len() #把集合作为参数传递给内建函数len(),返回集合的基数(或元素的个数)。 #s=set('dave come from anqing') #print(len(s)) #-->14 ########### 集合类型工厂函数 #set() and frozenset() #set()和 frozenset()工厂函数分别用来生成可变和不可变的集合。如果不提供任何参数,默认 #会生成空集合。如果提供一个参数,则该参数必须是可迭代的, #即,一个序列,或迭代器,或支持迭代的一个对象,例如:一个文件或一个字典。 #**************** Part 4: 集合类型内建方法 ********************** ###############方法(所有的集合方法) #内建方法copy() 没有等价的操作符。 #方法名称 操作 #s.issubset(t) 如果s 是t 的子集,则返回True,否则返回False #s.issuperset(t) 如果t 是s 的超集,则返回True,否则返回False #s.union(t) 返回一个新集合,该集合是s 和t 的并集 #s.intersection(t) 返回一个新集合,该集合是s 和t 的交集 #s.difference(t) 返回一个新集合,该集合是s 的成员,但不是t 的成员 #s.symmetric_difference(t) 返回一个新集合,该集合是s 或t 的成员,但不是s 和t 共有的成员 #s.copy() 返回一个新集合,它是集合s 的浅复制 ################# 操作符和内建方法比较 #很多内建的方法几乎和操作符等价。我们说"几乎等价",意思是它们间是有一个 #重要区别: 当用操作符时,操作符两边的操作数必须是集合。 在使用内建方法时,对象也可以是 #迭代类型的。为什么要用这种方式来实现呢? Python 的文档里写明: 采用易懂的 #set('abc').intersection('cbs') 可以避免用 set('abc') [and] 'cbs' 这样容易出错的构建方 #法。 ##可变集合类型的方法 #方法名 操作 #s.update(t) 用t 中的元素修改s, 即,s 现在包含s 或t 的成员 #s.intersection_update(t) s 中的成员是共同属于s 和t 的元素。 #s.difference_update(t) s 中的成员是属于s 但不包含在t 中的元素 #s.symmetric_difference_update(t) s 中的成员更新为那些包含在s 或t 中,但不 是s和t 共有的元素 #s.add(obj) 在集合s 中添加对象obj #s.remove(obj) 从集合s 中删除对象obj;如果obj 不是集合s 中的元素(obj not in s),将引发KeyError 错误 #s.discard(obj) 如果obj 是集合s 中的元素,从集合s 中删除对象obj; #s.pop() 删除集合s 中的任意一个对象,并返回它 #s.clear() 删除集合s 中的所有元素




-------------------------------------------------------------------------------------------------------
Blog: http://blog.youkuaiyun.com/tianlesoftware
Weibo: http://weibo.com/tianlesoftware
Email: dvd.dba@gmail.com
DBA1 群:62697716(满); DBA2 群:62697977(满) DBA3 群:62697850(满)
DBA 超级群:63306533(满); DBA4 群: 83829929(满) DBA5群: 142216823(满)
DBA6 群:158654907(满) DBA7 群:69087192(满) DBA8 群:172855474
DBA 超级群2:151508914 DBA9群:102954821 聊天 群:40132017(满)
--加群需要在备注说明Oracle表空间和数据文件的关系,否则拒绝申请

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值