集合(set)是一种由唯一元素组成的无序集合体。
先举一个简单的例子吧,某年在上海佘山举办英雄大会,来的有各门各派的武林人士。为了统计一下总共来了多少个门派。于是门口的保安大爷用python声明了一个集合(set)类型的变量gangs,然后每进一个人,老大爷就添加一个门派名称进入此集合变量中;最后老大爷统计一下gangs变量的元素个数即可。
>>> gangs = set([]) >>> gangs set([]) >>> gangs.add( "Shao Lin Pai" ) # 少林派 >>> gangs.add( "Tian Di Hui" ) # 天地会 >>> gangs.add( "Shao Lin Pai" ) # 少林派 >>> gangs.add( "Xue Sheng Hui" ) # 学生会 >>> gangs.add( "Tai Ping" ) # 太平天国 >>> gangs.add( "Tai Ping" ) # 太平天国 >>> gangs.add( "Yi He Tuan" ) # 义和团 >>> gangs.add( "Xing Xiu Pai" ) # 星宿派 >>> gangs.add( "ASLA" ) # 美国景观师协会 >>> gangs.add( "Ming Jiao" ) # 明教 >>> gangs.add( "Gai Bang" ) # 丐帮 >>> gangs.add( "Dan Huang Pai" ) # 蛋黄派 >>> gangs.add( "Yi He Tuan" ) # 义和团 >>> gangs.add( "Yi He Tuan" ) # 义和团 >>> gangs.add( "Gai Bang" ) # 丐帮 >>> gangs.add( "Gai Bang" ) # 丐帮 >>> gangs.add( "Gai Bang" ) # 丐帮 >>> gangs.add( "Gai Bang" ) # 日月神教 >>> gangs.add( "Gai Bang" ) # 丐帮 >>> gangs set(['Gai Bang', 'Ming Jiao', 'Tian Di Hui', 'Dan Huang Pai', 'Tai Ping', 'Xing Xiu Pai', 'ASLA', 'Shao Lin Pai', 'Xue Sheng Hui', 'Yi He Tuan']) >>> len( gangs ) 10
老大爷之所以用集合(set)变量来统计门派,主要是因为两点:一、门派之间是不分先后顺序的;二、集合是由唯一元素的构成的,比如之前集合中已经存在了丐帮,之后再来添加丐帮进去,集合是不会改变的。
用一个更直观的例子来展示,如下:
>>> s = set([]) >>> s.add( 1 ) >>> s.add( 2 ) >>> s.add( 3 ) >>> s.add( 3 ) >>> s set([1, 2, 3])
使用python的内置函数set()
可以将列表转换成相应的集合;而且这也是构建集合对象的最基础方式:
>>> set( [] ) set([]) >>> set( [1, 2, 3] ) set([1, 2, 3]) >>> set( [2, 2, 2] ) set([2])
还可以直接通过大括号的方式来构建集合(不包括空集合):
>>> { 1, 2, 3 } set([1, 2, 3]) >>> { 2, 2, 2 } set([2])
但是使用大括号的方式是无法构建空集合的,因为构建出来的不是空集合,而是字典(dict)类型对象。
>>> {} {} >>> type( {} ) <type 'dict'>
集合内的元素可以是整型、浮点型、字符串类型、元组等类型;但是列表、集合、字典等类型的对象是不能作为集合内的元素。会出错的,如下所示:
>>> { 1, 2, [1] } Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'list' >>> { 1, 2, set([]) } Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set' >>> { 1, 2, {1:2} } Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'dict'
列表(list)和元组(tuple)对比,列表对象不可以作为集合内元素,而元组对象是可以作为集合内元素的。
集合(set)与以前中学时期数学的集合(collection)非常类似,也是存在集合运算的;例如:添加、移除、清空、交集、并集、差集、对称差集等。这些都可以通过集合对象的内置函数实现,集合对象常用的内置函数如下:
内置函数 | 说明 |
---|---|
add |
向集合中添加一个元素 |
remove |
移除集合中的指定元素 |
clear |
清空集合中的所有元素 |
intersection |
返回两个集合共有元素构成的新集合(交集) |
union |
根据两个集合中所有元素而构建出一个新集合(并集) |
difference |
根据某集合中不存在于另一个集合中的元素而构建的新集合(差集) |
symmetric_difference |
返回两个集合的对称差集(对称差集) |
issubset |
判断一个集合是否是另外一个集合的子集(子集) |
issuperset |
判断一个集合是否是另外一个集合的父集(父集) |
添加:
>>> a = { 1, 2, 3, 4, 5 } >>> a.add( 6 ) >>> a set([1, 2, 3, 4, 5, 6])
移除:
>>> a = { 1, 2, 3, 4, 5 } >>> a.remove( 3 ) >>> a set([1, 2, 4, 5])
清空:
>>> a = { 1, 2, 3, 4, 5 } >>> a.clear() >>> a set([])
交集:
>>> a = { 1, 2, 3, 4, 5 } >>> b = { 1, 2, 3, 0, 6 } >>> c = a.intersection( b ) >>> c set([1, 2, 3])
并集:
>>> a = { 1, 2, 3, 4, 5 } >>> b = { 1, 2, 3, 0, 6 } >>> c = a.union( b ) >>> c set([0, 1, 2, 3, 4, 5, 6])
差集:
>>> a = { 1, 2, 3, 4, 5 } >>> b = { 1, 2, 3, 0, 6 } >>> print a.difference( b ) set([4, 5]) >>> print b.difference( a ) set([0, 6])
对称差集:
>>> a = { 1, 2, 3, 4, 5 } >>> b = { 1, 2, 3, 0, 6 } >>> print a.symmetric_difference( b ) set([0, 4, 5, 6]) >>> print b.symmetric_difference( a ) set([0, 4, 5, 6])
子集:
>>> a = { 1, 2, 3, 4, 5 } >>> b = { 1, 2, 3 } >>> print a.issubset( b ) False >>> print b.issubset( a ) True
父集:
>>> a = { 1, 2, 3, 4, 5 } >>> b = { 1, 2, 3 } >>> print a.issuperset( b ) True >>> print b.issuperset( a ) False >>>