肉渣教程

集合

上一节 下一节

集合(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
>>> 

运行一下


集合

上一节 下一节