Python集合知识点总结

文章目录

  • 集合(set)
  • 一、创建集合
      • 1.空集合:set()或{}
      • 2.使用花括号内以逗号分隔元素的方式
      • 3.使用集合推导式,类似列表推导式
      • 4.使用类型构造器:set(基本数据类型)
  • 二、添加
      • 1.add()方法
      • 2.update()方法
  • 三、删除
      • 1.remove(x):删除元素
      • 2.discard(x):删除元素
      • 3.pop():随机删除一个元素
      • 4.clear():清空集合
      • 5.del set
  • 四、修改(集合没有修改的功能)(了解)
  • 五、查询、访问集合——for循环
  • 六、去重操作
      • 1 集合去重(顺序会被打乱)
      • 2 列表去重
      • 3 itertools.grouby(list)函数去重,重新排序
  • 七、统计集合的长度
  • 八、浅拷贝/复制
  • 九、嵌套集合
  • 十、集合的基本运算
      • 1.并集:所有元素(|、union)
      • 2.交集:公共元素(&、intersection)
        • 2.1 交集并更新到集合中:公共元素==>更新到集合
      • 3.差集:自身独有元素(-、difference)
        • 3.1 差集并更新到集合中:独有成员==>更新到集合
      • 4.反差集(对称差集):^、symmetric_difference()
        • 4.1 反差集(对称差集)并更新到集合中
  • 十一、判断集合
      • 1 判断成员运算符(单个):in、not in
      • 2 判断子集、超集:issubset()、issuperset()
      • 3 判断两个集合之间关系:>、>=、<、<=
  • 十二、不可修改列表(冻结列表)(了解):

集合特点:1、不同元素组成(不重复) 2、无序 3、集合中的元素必须是不可变类型


集合(set)

集合为Python基本数据之一,它是无序的(排列顺序无序)、无索引的(不能通过下标索引)、不重复的(元素不重复);集合里面的元素必须是可hash的(int,str,tuple,bool)。可以与字典一起记忆,set就是dict类型的数据但是不保存value,只保存key,set也用{}表示。

集合不支持的功能:作为一种无序的多项集,集合并不记录元素位置或插入顺序。 相应地,集合不支持索引、切片或其他序列类的操作。

集合支持的功能:包括成员检测、从序列中去除重复项以及数学中的集合类计算,例如交集、并集、差集与对称差集等等。


提示:以下是本篇文章正文内容,下面案例可供参考

一、创建集合

1.空集合:set()或{}

st = set()
print(type(st)) # 
dt = {}
print(type(dt)) # 

2.使用花括号内以逗号分隔元素的方式

basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
print(basket) # {'banana', 'orange', 'apple', 'pear'}

3.使用集合推导式,类似列表推导式

sets = {c for c in 'abracadabra'}
print(sets)

4.使用类型构造器:set(基本数据类型)

  • 分别将字符串、列表、元组、字典(只针对key键)转为集合
set1 = set('abcdecc') # {'b', 'd', 'e', 'a', 'c'}
set2 = set([1,2,3,4,5]) # {1, 2, 3, 4, 5}
set3 = set(('a','b','c')) # {'c', 'a', 'b'}
set4 = set({'a':1,'b':2}) # {'a', 'b'} value值舍弃

二、添加

  • 了解集合的添加操作前,先了解列表的添加元素:
ls = [1,2,3,4,5,6]
new_list = []
for i in ls:
    if i not in new_list: # 可以元素判断重复否
        new_list.append(i)
print(new_list) # [1, 2, 3, 4, 5, 6]

1.add()方法

num_set = {1,2,3,4}
num_set.add(6)
print(num_set) # {1, 2, 3, 4, 6}

2.update()方法

s = {1,2,3,4,5}
s.update([7,8])
print(s) # {1, 2, 3, 4, 5, 7, 8}

三、删除

s.remove(x) 删除元素,不存在会报错
s.discard(x) 删除元素,不存在不会报错
n = s.pop() 随机删除一个元素,并返回删除的元素值
s.clear() 清空集合的所有元素
del s 删除整个集合,注意集合是不能索引下标的

1.remove(x):删除元素

要删除的元素不存在时,会报错。

s = {1,2,3,4,5,6,7}
s.remove(7)
print(s) # {1, 2, 3, 4, 5, 6}

2.discard(x):删除元素

删除指定的元素,找不到元素,返回原集合

s = {1,2,3,4,5,6,7}
s.discard(4)
print(s) # {1, 2, 3, 5, 6, 7}
s.discard(11)
print(s) # {1, 2, 3, 5, 6, 7}

3.pop():随机删除一个元素

随机删除一个元素,并返回删除的元素。集合为无序的,即顺序无序,时刻都可能在变化,故pop()方法删除的元素是随机的。

s = {1,2,3,4,5,6,7}
pop_num = s.pop()
print(pop_num) # 1

4.clear():清空集合

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

5.del set

s = {1,2,3,4,5,6,7}
del s
# print(s) 报错,集合已经删除
# del s[0] 报错,集合不支持索引

四、修改(集合没有修改的功能)(了解)

集合是不可索引的,因此没有办法通过索引修改集合的元素,也没有对应的函数(方法)修改集合元素的值,可以先删除再添加,达到改变的集合的数据,实现修改集合。

  • 先删除再添加,实现修改集合
s = {1,2,3,4,5,6,7}
s.remove(3) # 先删除元素
s.add(33)   # 再添加元素
print(s)    # {1, 2, 33, 4, 5, 6, 7}

五、查询、访问集合——for循环

注意:集合是无序的,不支持索引查找对应的值(元素),只能判断指定元素存在集合中的True或False(详细见下面的in、not in成员判断),以for循环遍历集合中的所有元素。

for i in {1,2,3,4,5}:
    print(i)

六、去重操作

1 集合去重(顺序会被打乱)

s = {1,2,8,3,4,5,3,5,4,5,7}
print(s) # {1, 2, 3, 4, 5, 7, 8}
print(list(s)) # [1, 2, 3, 4, 5, 7, 8]

2 列表去重

(1)不必按照原序列的顺序排序

l = ['a','a','c','b','e','d','d','f']
nl = list(set(l))
print(nl) # ['f', 'c', 'd', 'b', 'a', 'e'],顺序跟set()有关,会时刻变化

(2)按照原序列的顺序排序

  • 方法一:

开发思路:直接使用set()构造器去重,再转换回列表,最后对新列表进行排序sort(key=list.index)

l = ['a','a','c','b','e','d','d','f']
nl = list(set(l))
nl.sort(key=l.index) # 按照原列表顺序排列
print(nl) # ['a', 'c', 'b', 'e', 'd', 'f']
  • 方法二:

开发思路:for遍历原列表,如果新列表没有,就取一个元素就放一个元素到新列表中,这样顺序按照原列表的顺序排列。

l = [1,2,3,3,4,5,3,5,4,5,7]
nl = []
for item in l:
    if item not in nl:
        nl.append(item)
print(nl) # [1, 2, 3, 4, 5, 7]

3 itertools.grouby(list)函数去重,重新排序

import itertools

l = [1,4,3,3,4,2,3,4,5,6,1]
l.sort()
sl = itertools.groupby(l)
print(sl) # 
for k,obj in sl:
    print(k)
"""输出
a
b
c
d
e
f
"""

七、统计集合的长度

s = {1,2,3,4,5}
print(len(s))

八、浅拷贝/复制

s = {1,2,3,4,5}
s1 = s.copy() # 该方法,如果删除原集合,不会导致副本集合的改变
print(s1)

九、嵌套集合

s = {11,1.1,'helle',(1,2,3)}
print(s)
  • 注意:集合的元素,其基本数据类型是不可变数据类型(比如list、dict、set就不可作为集合的元素)
    集合元素的数据类型情况如下:
s1 = {1,2,3}
s2 = {'a','b','c'}
s3 = {(1,2,3),('a','b')}
# s4 = {[1,2,3],4,5} 报错,元素数据类型不能是列表
# s5 = {{1,2,3},4,5} 报错,元数数据类型不能是集合
# s6 = {{1:'a','b':True},333,222,111} 报错,元数数据类型不能是字典

十、集合的基本运算

1.并集:所有元素(|、union)

set1 = {-2,-1,0,1,2,3}
set2 = {-2,1,2,3,4,5}

# 并集:所有元素(|、union)
print(set1.union(set2)) # {0, 1, 2, 3, 4, 5, -1, -2}
# print(set2.union(set1)) # {0, 1, 2, 3, 4, 5, -1, -2}
print(set1 | set2) # {0, 1, 2, 3, 4, 5, -1, -2}
# print(set2 | set1) # {0, 1, 2, 3, 4, 5, -1, -2}

2.交集:公共元素(&、intersection)

set1 = {-2,-1,0,1,2,3}
set2 = {-2,1,2,3,4,5}

# 交集:公共元素(&、intersection)
print(set1.intersection(set2)) # {1, 2, 3, -2}
# print(set1.intersection(set3)) # {1, 2, 3, -2}
print(set2 & set1) # {1, 2, 3, -2}
# print(set1 & set2) # {1, 2, 3, -2}

2.1 交集并更新到集合中:公共元素==>更新到集合

set1 = {1,2,3,4}
set2 = {3,4,5,6}

# 交集并更新到set2
# set2.intersection_update(set1)
# print(set2) # {3, 4}

# 交集并更新到set1
# set1.intersection_update(set2)
# print(set1) # {3, 4}

3.差集:自身独有元素(-、difference)

set1 = {-2,-1,0,1,2,3}
set2 = {-2,1,2,3,4,5}

# 差集:独有元素(-、difference)
# 差集:set2独有的成员
print(set2.difference(set1)) # {4, 5}
print(set2 - set1) # {4, 5}
# 差集:set1独有的成员
print(set1.difference(set2)) # {0, -1}
print(set1 - set2) # {0, -1}

3.1 差集并更新到集合中:独有成员==>更新到集合

set1 = {1,2,3,4}
set2 = {3,4,5,6}

# 差集并更新到set1
# set1.difference_update(set2)
# print(set1) # {1, 2}

# 差集并更新到set2
# set2.difference_update(set1)
# print(set2) # {5, 6}

4.反差集(对称差集):^、symmetric_difference()

俩集合各自独有元素之和,即不包含共有的其它元素之和。
也可以理解,先差集,再取反。即:各自独有的成员集合((s1-s2)+(s2-s1))。

set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}

# 反差集(对称差集):^、symmetric_difference()
print(set1.symmetric_difference(set2)) # {1, 2, 5, 6}
# print(set2.symmetric_difference(set1)) # {1, 2, 5, 6}
print(set1 ^ set2) # {1, 2, 5, 6}
# print(set2 ^ set1) # {1, 2, 5, 6}

4.1 反差集(对称差集)并更新到集合中

先差集,再取反,最后将结果更新到集合中

set1 = {1, 2, 3, 4}
set2 = {3, 4, 5, 6}

# 反差集(对称差集)并更新到集合中
# set1.symmetric_difference_update(set2)
# print(set1) # {1, 2, 5, 6}
# set2.symmetric_difference_update(set1)
# print(set2) # {1, 2, 5, 6}

十一、判断集合

1 判断成员运算符(单个):in、not in

sets = {1, 2, 3, 4, 5}
print(5 in sets) # True
print(9 in sets) # False
print(3 not in sets) # False
print(0 not in sets) # True

2 判断子集、超集:issubset()、issuperset()

  • 判断集合A所有元素都在集合B中 / 判断子集:issubset()
set1 = {1,2,3,4,5,6,7}
set2 = {2,3}
print(set1.issubset(set2)) # False
print(set2.issubset(set1)) # True
  • 判断超集:issuperset()
set1 = {1,2,3,4,5,6,7}
set2 = {2,3}
print(set1.issuperset(set2)) # True,表示set1是set2的超集
print(set2.issuperset(set1)) # False,表示set2不是set1的超集
  • 补充:子集、超集——("<",">"),可以忽略
s1 = {1, 2, 3}
s2 = {1, 2, 3, 4, 5}
# 子集
print(s1 < s2)  # s1是s2的子集 # True
print(s1.issubset(s2))  # True
# 超集
print(s1 > s2)  # s1不是s2的超集 # False
print(s2.issuperset(s1))  # s2是s1的超集 # True

3 判断两个集合之间关系:>、>=、<、<=

s1 = {1, 2, 3, 4, 5}
s2 = {1, 2, 3}
print(s1 < s2)  # False,检测集合s1是否为s2的真子集,s1 <= s2 and s1 != s2
print(s1 <= s2)  # False,检测是否集合s1中的每个元素都在s2中
print(s1 > s2)  # True s1是s2的超集
print(s1 >= s2) # True

十二、不可修改列表(冻结列表)(了解):

set集合本身是可以发生改变的,是不可hash的。我们可以使用frozenset来保存数据,frozenset是不可变,也就是一个可hash的数据类型。

s = frozenset(['a','b','c','d'])
print(s) # frozenset({'c', 'a', 'd', 'b'})
dict1 = {s:"123"}
print(dict1) # {frozenset({'c', 'b', 'a', 'd'}): '123'}

你可能感兴趣的:(python)