Python 集合


集合是可包含多种类型数据的无顺序集合,集合不包含重复数据,是可改变的。


集合的元素可以是字符串、数字、元组等不能改变的值,但不能是字典和列表等可改变的值。

集合是无顺序的,集合不支持通过索引访问和更改集合元素,也不支持切片。

创建列表

集合有下面几种创建方式:

  • 集合元素前后加上一个大括号,集合元素之间使用逗号分隔。例如:{1, 2, 'hello'}。
  • 通过set函数将一个序列(sequence)转换成集合。
  • 通过集合推导创建集合。例如:{x * 2 for x in list}。

下面是创建集合的例子:

#!/usr/bin/python
print({1, 2, 'hello'})  # {1, 2, 'hello'}

print(set([1, 2, 3]))   # {1, 2, 3}

print({x * 2 for x in [1, 2, 3]})   # {2, 4, 6}
print({x * 2 for x in range(5) if x % 2 == 0})  # {0, 8, 4}

集合运算符

有下面几个运算符用于集合:

  • ==:比较两个集合是否相等。
  • <:判断一个集合是否是另一个集合的子集。
  • <=:判断一个集合的所有元素是否都存在于另一个集合中。
  • >:判断一个集合是否是另一个集合的超集。
  • >=:判断第二个集合的所有元素是否都存在于第一个集合中。
  • |:union,得到两个集合的并集(两个集合所有元素合并到一起)。
  • &:intersection,得到两个集合的交集(两个集合中都存在的元素)。
  • -:difference,得到两个集合的差集(在一个集合中存在,但在另一个集合中不存在的元素的集合,即set1 - set2)。
  • ^:symmetric difference,得到两个集合的对称差集(两个集合中所有的元素,排除两个集合中都存在的元素,得到的元素组成的集合)。
  • in:判断对象是否包含在集合中。
  • not in:判断对象是否没包含在集合中。

另外|=&=-=^=运算符是|&-^运算符和赋值运算符两个运算符一起使用的简写形式。

下面是集合运算符的例子:

#!/usr/bin/python
print({1, 2} == {2, 1})     # True

print({1, 2, 3} | {4, 5})   # {1, 2, 3, 4, 5}
print({1, 2, 3} & {1, 5})   # {1}
print({1, 2, 3} - {3, 5})   # {1, 2}
print({1, 2, 3} ^ {2, 5})   # {1, 3, 5}

print('\n', {1, 2, 3} > {1, 5})   # False
print({1, 2, 3} > {1, 2})   # True

print('\n', 1 in {1, 2})    # True
print(1 not in {1, 2})      # False

集合推导

集合推导(Set comprehension)把一个集合映射为一个新的集合。

集合推导分为两部分,第一部分描述新集合元素的生成过程,第二部分是for语句和if语句,迭代取出旧集合的元素。

#!/usr/bin/python
print({x * 2 for x in range(5)})    # {0, 8, 2, 4, 6}
print({x * y for x in range(3) for y in [5, 6]})    # {0, 10, 12, 5, 6}
print({x * y for x in range(3) for y in {5, 6} if x % 2 == 0})  # {0, 10, 12}

增加、删除元素

  • 集合中增加一个元素使用add方法,增加多个元素使用update方法。集合的元素是不会重复的,增加同一个元素多次,集合中只包含一个元素。
  • 使用discard方法或remove方法可以删除集合的指定元素(如果集合中不存在指定元素,remove会抛出错误),pop方法删除任意一个元素并返回该元素,clear方法删除所有元素。

下面是增加、删除元素的例子:

#!/usr/bin/python
s = {1, 2}
s.add(3)
print(s)    # {1, 2, 3}
s.update({4, 5})
print(s)    # {1, 2, 3, 4, 5}

s.discard(1)
print(s)    # {2, 3, 4, 5}
s.clear()
print(s)    # set()

del s
#print(s)    # error : NameError: name 's' is not defined

常用集合函数

  • all:如果集合中的所有元素都为True或集合是空的,则返回True。
  • any:如果集合中有一个元素为True,则返回True。如果集合是空的,返回False。
  • enumerate:返回一个枚举对象,包含集合中所有元素的索引和值为一个元组。
  • len:返回集合的长度。
  • set:转换一个可迭代对象(元组、字符串、字典)为一个集合对象。
  • max:返回集合中最大的元素。
  • min:返回集合中最小的元素。
  • sorted:返回一个新的排过序的列表,不更改参数集合。
  • sum:返回集合中元素的和。

下面是常用集合函数的例子:

#!/usr/bin/python
s = {'red', 'blue', 'orange'}

for e in enumerate(s):
    print(e, end=', ')  # (0, 'blue'), (1, 'orange'), (2, 'red'),

print('\n', sorted(s))  #  ['blue', 'orange', 'red']

print(set([1, 2, 3]))   # {1, 2, 3}
print(set({1: 'red', 2: 'blue'}))   # {1, 2}

常用集合方法

  • add:往集合中增加一个元素。
  • clear:删除集合中所有的元素。
  • copy:返回集合的浅拷贝。
  • difference:即set - other - ...,返回在当前集合但不在其它集合中的元素作为一个新集合。
  • difference_update:即set -= other | ...,从当前集合中删除其它集合中的所有元素。
  • discard:从集合中删除指定元素,如果集合中不存在指定元素,则不执行任何操作。
  • intersection:即set & other & ...,返回当前集合和其它集合的交集作为一个新集合。
  • intersection_update:即set &= other & ...,更新当前集合为当前集合和其它集合的交集。
  • isdisjoint:如果两个集合没有交集,则返回True。
  • issubset:如果另一个集合包含当前集合,则返回True。
  • issuperset:如果当前集合包含另一个集合,则返回True。
  • pop:删除任意一个元素并返回该元素。
  • remove:删除集合中的指定元素(如果集合中不存在指定元素,remove会抛出错误)。
  • symmetric_difference:即set ^ other,两个集合中所有的元素,排除在两个集合中都存在的元素,得到的元素组成和新集合。
  • symmetric_difference_update:即set ^= other,更新当前集合为两个集合中所有的元素,排除两个集合中都存在的元素。
  • union:即set | other | ...,返回当前集合和其它所有集合的并集。
  • update:即set |= other | ...,更新当前集合为当前集合和其它所有集合的并集。

下面是常用集合方法的例子:

#!/usr/bin/python
s = {1, 2 , 3, 4}
print(s.difference({2, 10}, {3, 15}))   # {1, 4}
print('s:', s)  # {1, 2, 3, 4}

print(s.union({2, 10}, {3, 15}))    # {1, 2, 3, 4, 10, 15}
print('s:', s)  # {1, 2, 3, 4}

print(s.update({4, 20}, {5, 25}))   # None
print('s:', s)  # {1, 2, 3, 4, 20, 5, 25}