集合


01.set是可变的,无序的,不重复的元素的集合。

  • 集合的基本概念:
    • 全集,所有元素的集合;例如实数集,所有实数组成的集合就是全集。
    • 子集(subset)和超集(superset),一个集合a的所有元素都在另一个集合b中,a是b的子集,b是a的超集。
    • 真子集和真超集,a是b的子集,且a不等于b;a是b的真子集,b是a的真超集。
    • 并集,多个集合合并的结果。
    • 交集,多个集合的公共部分。
    • 差集,集合中除去和其他集合公共的部分。
  • 集合的定义方法:
    • 使用花括号定义,比如:new_set = {"node01", "node02"}
      • 使用空的花括号会定义一个字典,而非集合。
    • 使用set()函数定义,比如:new_set = set(range(10))。
      • set()函数仅可接受一个参数,该参数为一个可迭代对象。
      • set()函数可定义一个空集合(唯一定义空集合的方法)。
  • 集合操作的原理:
    • 将集合中的每一个元素进行hash运算,将对应的值作为引用的标记。
      • 列表,集合和字典无法作为集合的元素。
  • 集合的特性包括:
    • 集合的元素要求必须可以hash。
    • 集合的元素不可以索引。
    • 集合可以迭代。


02.set的内置方法:

  • 添加元素:
    • add(),为集合添加一个元素,比如:
      new_set = {14, 'guti',(7, 'raul')}
      new_set.add('carlos')
      print(new_set)
    • update(),合并其他元素到集合中来,参数比如是可迭代的对象,比如:
      new_set = {1, 2, 3, 4, 5}
      new_set.update(range(2, 7))
      print(new_set)
      • update()会遍历可迭代对象中的元素,再分别将元素add()到当前的集合中。
  • 删除元素:
    • remove(value),从集合中移除一个元素;若元素不存在,则抛出KeyError。
    • discard(value),从集合中移除一个元素;如元素不存在,什么都不返回。
    • pop(),移除并返回任意的元素;如是空集合,则返回KeyError,比如:
      new_set = {'guti', 'raul', 'carlos'}
      result = new_set.pop()
      print(result)
    • clear(),删除所有的元素。
  • 修改元素:
    • 集合不能修改元素;要么删除,要么加入新的元素。
  • 查询元素:
    • 非线性结构,无法索引;可以迭代所有元素。
    • 使用in或者not in查询元素是否在集合中较高,推荐使用。
      • 线性结构(比如列表)的查询事件复杂度是O(n),即随着数据规模的增大而增加耗时。
      • 集合,字典等结构,内部使用hash值作为key,时间复杂度为O(1),即查询时间和数据规模无关。


03.set的运算:

  • 并集,将集合a和集合b的所有元素合并到一起,组成的集合称为集合a与集合b的并集。
    • union(),用于返回多个集合合并后的新集合,也可以使用运算符”|”重载,比如:
      set_a = {'guti', 'raul', 'carlos'}
      set_b = {'guti', 'figo', 'salgado'}
      print(set_a.union(set_b))dddd
      print(set_a | set_b)
  • 交集,集合a和b,由所有属于a且属于b的元素组成的集合。
    • intersection(),用于返回多个集合的交集,也可以使用运算符”&”重载,比如:
      set_a = {'guti', 'raul', 'carlos'}
      set_b = {'guti', 'figo', 'salgado'}
      print(set_a.intersection(set_b))
      print(set_a & set_b)
  • 差集,集合a和集合b,由所有属于a且不属于b的元素组成的集合。
    • difference(),用于返回多个集合的差集,也可以使用运算符”-“重载,比如:
      set_a = {'guti', 'raul', 'carlos'}
      set_b = {'guti', 'figo', 'salgado'}
      print(set_a.difference(set_b))
      print(set_a - set_b)
  • 对称差集,集合a和集合b,由所有不属于a和b的交集元素组成的集合,记做(a-b) U (b-a)。
    • symmetric_differece(),用于返回多个集合的对称差集,也可以使用运算符”^”重载,比如:
      set_a = {'guti', 'raul', 'carlos'}
      set_b = {'guti', 'figo', 'salgado'}
      print(set_a.symmetric_difference(set_b))
      print(set_a ^ set_b)


04.set的逻辑运算:

  • a <= b,判断集合a是否是集合b的子集。
  • a < b,判断集合a是否是集合b的真子集,比如:
set_a = {'guti'}
set_b = {'guti', 'figo', 'salgado'}
print(set_a < set_b)
  • a >= b,判断集合a是否是集合b的超集。
  • a > b,判断集合a是否是集合b的真超集。
  • a.isdisjoint(b),判断集合a与集合b是否有交集,比如:
set_a = {'guti', 'carlos'}
set_b = {'guti', 'figo', 'salgado'}
print(set_a.isdisjoint(set_b))
  • 如没有交集,返回true,反之返回false。



集合解析式


01.集合解析式:

  • 集合解析式指使用特定语句返回一个新的集合,其格式为:
{返回值 for 元素 in 可迭代对象 if 条件}
  • 集合解析式的示例:
result = {(x,x+1) for x in range(10)}
print(result)
文档更新时间: 2020-05-25 16:20   作者:闻骏