Python中set与frozenset方法和区别详解
set(可变集合)与frozenset(不可变集合)的区别:
set无序排序且不重复,是可变的,有add(),remove()等方法。既然是可变的,所以它不存在哈希值。基本功能包括关系测试和消除重复元素.集合对象还支持union(联合),intersection(交集),difference(差集)和sysmmetricdifference(对称差集)等数学运算.
sets支持xinset,len(set),和forxinset。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持indexing,或其它类序列的操作。
frozenset是冻结的集合,它是不可变的,存在哈希值,好处是它可以作为字典的key,也可以作为其它集合的元素。缺点是一旦创建便不能更改,没有add,remove方法。
一、集合的创建
set()和frozenset()工厂函数分别用来生成可变和不可变的集合。如果不提供任何参数,默认会生成空集合。如果提供一个参数,则该参数必须是可迭代的,即,一个序列,或迭代器,或支持
迭代的一个对象,例如:一个列表或一个字典。
>>>s=set('cheeseshop')使用工厂方法创建 >>>s {'h','c','o','s','e','p'} >>>type(s) <type'set'> >>>s={'chessseshop','bookshop'}直接创建,类似于list的[]和dict的{},不同于dict的是其中的值,set会将其中的元素转换为元组 >>>s {'bookshop','chessseshop'} >>>type(s) <type'set'>
不可变集合创建:
>>>t=frozenset('bookshop') >>>t frozenset({'h','o','s','b','p','k'})
二、更新可变集合
用各种集合内建的方法和操作符添加和删除集合的成员:
>>>s.add('z')#添加 >>>s set(['c','e','h','o','p','s','z']) >>>s.update('pypi')#添加 >>>s set(['c','e','i','h','o','p','s','y','z']) >>>s.remove('z')#删除 >>>s set(['c','e','i','h','o','p','s','y']) >>>s-=set('pypi')#删除 >>>s set(['c','e','h','o','s']) >>>dels#删除集合
只有可变集合能被修改。试图修改不可变集合会引发异常。
>>>t.add('z') Traceback(mostrecentcalllast): File"<stdin>",line,in? AttributeError:'frozenset'objecthasnoattribute'add'
三、成员关系(in,notin)
>>>'k'ins False >>>'k'int True >>>'c'notint True
四、集合等价/不等价
>>>s==t False >>>s!=t True >>>u=frozenset(s) >>>s==u True >>>set('posh')==set('shop') True
五、子集/超集
>>>set('shop')<set('cheeseshop') True >>>set('bookshop')>=set('shop') True
六、遍历访问集合中的值(可变集合和非可变都支持)
>>>s=set('cheeseshop') >>>s {'h','c','o','s','e','p'} >>>foriins: print(i) h c o e p >>>t=frozenset('bookshop') >>>t frozenset({'h','o','s','b','p','k'}) >>>foriint: print(i) h o b p k
七、集合类型操作符(所有的集合类型)
1.联合(|)
两个集合的联合是一个新集合,该集合中的每个元素都至少是其中一个集合的成员,即,属于两个集合其中之一的成员。联合符号有一个等价的方法,union(). >>>s|t set(['c','b','e','h','k','o','p','s'])
2.交集(&)
你可以把交集操作比做集合的AND(或合取)操作。两个集合的交集是一个新集合,该集合中的每 个元素同时是两个集合中的成员,即,属于两个集合的成员。交集符号有一个等价的方法,intersection() >>>s&t set(['h','s','o','p']
3.差补/相对补集(–)
两个集合(s和t)的差补或相对补集是指一个集合C,该集合中的元素,只属于集合s,而不属 于集合t。差符号有一个等价的方法,difference(). >>>s-t set(['c','e'])
4.对称差分(^)
和其他的布尔集合操作相似,对称差分是集合的XOR(又称"异或"). 两个集合(s和t)的对称差分是指另外一个集合C,该集合中的元素,只能是属于集合s或者集合t 的成员,不能同时属于两个集合。对称差分有一个等价的方法,symmetric_difference(). >>>s^t set(['k','b','e','c'])
5.混合集合类型操作
上面的示例中,左边的s是可变集合,而右边的t是一个不可变集合.注意上面使用集合操作 运算符所产生的仍然是可变集合,但是如果左右操作数的顺序反过来,结果就不一样了: >>>t|s frozenset(['c','b','e','h','k','o','p','s']) >>>t^s frozenset(['c','b','e','k']) >>>t-sfrozenset(['k','b'])
如果左右两个操作数的类型相同,既都是可变集合或不可变集合,则所产生的结果类型是相同的,但如果左右两个操作数的类型不相同(左操作数是set,右操作数是frozenset,或相反情况),则所产生的结果类型与左操作数的类型相同。
八、可变集合类型的方法
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中的元素(objnot ins),将引发KeyError错误 s.discard(obj)如果obj是集合s中的元素,从集合s中删除对象obj; s.pop()删除集合s中的任意一个对象,并返回它 s.clear()删除集合s中的所有元素
九、集合类型操作符、函数和方法
函数/方法名等价运算符说明
所有集合类型:
len(s)集合基数:集合s中元素的个数 set([obj])可变集合工厂函数;obj必须是支持迭代的,由obj中的元素创建集合,否则创建一个空集合 frozenset([obj])不可变集合工厂函数;执行方式和set()方法相同,但它返回的是不可变集合 objins成员测试:obj是s中的一个元素吗? objnotins非成员测试:obj不是s中的一个元素吗? s==t等价测试:测试s和t是否具有相同的元素? s!=t不等价测试:与==相反 s<t(严格意义上)子集测试;s!=t而且s中所有的元素都是t的成员 s.issubset(t)s<=t子集测试(允许不严格意义上的子集):s中所有的元素都是t的成员 s>t(严格意义上)超集测试:s!=t而且t中所有的元素都是s的成员 s.issuperset(t)s>=t超集测试(允许不严格意义上的超集):t中所有的元素都是s的成员 s.union(t)s|t合并操作:s或t中的元素 s.intersec-tion(t)s&t交集操作:s和t中的元素 s.difference(t)s-t差分操作:s中的元素,而不是t中的元素 s.symmetric_difference(t)s^t对称差分操作:s或t中的元素,但不是s和t共有的元素 s.copy()复制操作:返回s的(浅复制)副本
仅用于可变集合:
s.update(t)s|=t(Union)修改操作:将t中的成员添加s s.intersection_update(t)s&=t交集修改操作:s中仅包括s和t中共有的成员 s.difference_update(t)s-=t差修改操作:s中包括仅属于s但不属于t的成员 s.symmetric_ difference_ update(t)s^=t对称差分修改操作:s中包括仅属于s或仅属于t的成员 s.add(obj)加操作:将obj添加到s s.remove(obj)删除操作:将obj从s中删除;如果s中不存在 obj,将引发KeyError s.discard(obj)丢弃操作:remove()的友好版本-如果s中存在obj,从s中删除它 s.pop()Pop操作:移除并返回s中的任意一个元素 s.clear()清除操作:移除s中的所有元素
以上所述是小编给大家介绍的Python中set与frozenset方法和区别详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!