和列表很相似,最明显的不同就是集合是一个 无序 、可变、不允许数据重复的容器。

特点

  • 容器
  • 元素不重复
  • 无序,无法通过索引取值。
  • 可变,可以添加和删除元素。

1.定义

定义空集合

  1. a = set()

注意
1.定义空集合时,只能使用v = set(),不能使用 v={}(这样是定义一个空字典);
2.也不能使用 v=()(这样是定义一个空元组)。

定义非空集合

  1. v1 = {11, 22, 33, 44}

集合中对值的要求:

  • :必须可哈希。目前为止学到的可哈希的类型:int/bool/str/tuple;不可哈希的类型:list/set/dict

2.操作

集合是由不重复元素组成的无序容器。基本用法包括成员检测、消除重复元素。集合对象支持合集、交集、差集、对称差分等数学运算。

2.1.增

  1. data = {"miss", '五五开', "卢本伟"}
  2. data.add("沐风")
  3. print(data)

可以发现,每次运行后输出的data不一样,这是为了提醒coder集合是无序的

  1. data = {"miss", '五五开', "卢本伟"}
  2. data.add("沐风")
  3. data.add("精易")
  4. print(data)
  1. data = {"miss", '五五开', "卢本伟"}
  2. data.add("沐风", "精易") # TypeError: add() takes exactly one argument (2 given)

可以发现,集合不能批量添加元素

2.2.删

集合删除元素有两种语法:discard,remove。区别在于:如果要删除的元素不存在,后者会报错KeyError,前者不报错。

  1. # 语法一
  2. data = {"miss", '五五开', "卢本伟"}
  3. data.discard("卢本伟")
  4. print(data) # {'五五开', 'miss'}
  1. # 语法二
  2. data = {"miss", '五五开', "卢本伟"}
  3. data.remove("卢本伟")
  4. print(data) # {'五五开', 'miss'}

2.3.改

交集

  1. s1 = {"2021", "沐风", "598779784", "Python"}
  2. s2 = {"2020", "精易", "446809585", "Python"}
  3. # 语法一
  4. s4 = s1.intersection(s2) # 取两个集合的交集
  5. print(s4) # {'Python'}
  6. # 语法二
  7. s3 = s1 & s2 # 取两个集合的交集
  8. print(s3) # {'Python'}

并集

  1. s1 = {"2021", "沐风", "598779784", "Python"}
  2. s2 = {"2020", "精易", "446809585", "Python"}
  3. # 语法一
  4. s4 = s1.union(s2) # {'2020', '2021', '446809585', 'Python', '沐风', '精易', '598779784'}
  5. print(s4)
  6. # 语法二
  7. s3 = s1 | s2 # {'2020', '2021', '446809585', 'Python', '沐风', '精易', '598779784'}
  8. print(s3)

差集

  1. s1 = {"2021", "沐风", "598779784", "Python"}
  2. s2 = {"2020", "精易", "446809585", "Python"}
  3. # 语法一
  4. s4 = s1.difference(s2) # 差集,s1中有且s2中没有的值 {'2021', '598779784', '沐风'}
  5. s6 = s2.difference(s1) # 差集,s2中有且s1中没有的值 {'2020', '446809585', '精易'}
  6. # 语法二
  7. s3 = s1 - s2 # 差集,s1中有且s2中没有的值 {'598779784', '沐风', '2021'}
  8. s5 = s2 - s1 # 差集,s2中有且s1中没有的值 {'精易', '446809585', '2020'}

2.4.查

遍历

  1. # 只得到值
  2. data = {"miss", '五五开', "卢本伟"}
  3. for item in data:
  4. print(item)

07 集合 - 图1
[attach]4509[/attach]

  1. # 得到索引和值
  2. data = {"miss", '五五开', "卢本伟"}
  3. for v in enumerate(data):
  4. print(v)

07 集合 - 图2
[attach]4510[/attach]

可以看出,每次遍历集合的顺序不一样,也说明了集合是无序的。

2.5.统计

集合长度

  1. data = {"miss", '五五开', "卢本伟"}
  2. print(len(data)) # 3

是否存在

  1. score_set = (66, 88, 99, 66, 10)
  2. print(66 in score_set) # True
  3. print('hi' in score_set) # False

2.6.类型转换

str转set

  1. name = "沐风开发与分析"
  2. data = set(name) # {'开', '发', '风', '与', '沐', '分', '析'}
  3. print(data)

list转set

  1. data = ["miss", '五五开', "卢本伟"]
  2. print(set(data)) # {'五五开', 'miss', '卢本伟'}

tuple转set

  1. data = ("miss", '五五开', "卢本伟")
  2. print(set(data)) # {'五五开', 'miss', '卢本伟'}

dict转set

  1. info = {'age': '16', 'name': 'ecithy', 'gender': '男'}
  2. print(set(info.keys())) # {'age', 'gender', 'name'}
  3. print(set(info.values())) # {'ecithy', '男', '16'}