Python内置数据结构 - 集合set

版权声明:欢迎转载,转载请注明作者和出处 https://blog.csdn.net/bruesz/article/details/82883029

集合的定义

  • 集合是高中数学中的一个概念
  • 一堆确定的无序的唯一的数据,每个数据称为元素
  • 无法使用索引和分片(因为无序)
  • 数据具有唯一性,可以用来排重(排除重复数据)
  • 集合内部数据只能放置可哈希的数据,比如:str, int, float, tuple, 冰冻集合(frozen set) 等。
  • 无法用大括号定义一个空集合

集合的操作

  • 成员检测: in, not in
# 成员检测
# in, not in 

s = {3,54,"i", "love", "you"}
# 可以看到集合是无序的,print打出的不一定是你输入的顺序
print(s)

if "love" in s:
    print("爱")

if "haha" not in s:
    print("not found")
  • for 循环
# for循环
s = {3,54,"i", "love", "you"}
for i in s:
    print(i, end = " ")

# 带有元组的集合的遍历
# 如果元组的个数一致
s = {(1,2,3),('a','b','c'),("I","love", "you")}

for k,l,m in s:
    print(k,"--",l,"--",m)
for k in s:
    print(k)
  • 集合的内涵
# 普通的集合内涵
# 以下集合在初始化后自动过滤掉重复元素
s = {2,3,3,4,23,234,34,2,33,3,3,33,3,33,1,2,33,4}
print(s)

# 带条件的集合内涵
s = {2,3,3,4,23,234,34,2,33,3,3,33,3,33,1,2,33,4}
# 返回s中的偶数的集合
ss = {i for i in s if i % 2 == 0}
print(s)
print(ss)

# 多循环的集合内涵

s1 = {1,2,3,4}
s2 = {"i", "love","wangwang"}

# 以下语句类似两个for循环
# for m in s1:
#    for n in s2:
#        把m*n添加到s的集合中
s = {m*n for m in s1 for n in s2}
print(s)

# 有条件的多循环的集合内涵,只能一行判断条件
# 以下语句类似两个for循环
# for m in s1:
#    for n in s2:
#        if n ==2:
#            把m*n添加到s的集合中
print("*" * 20)
s = {m*n for m in s1 for n in s2 if m ==2}
print(s)

集合内部函数

  • add:向集合中添加数据add, 注意集合里没有顺序,所以没有append和insert方法
  • clear:原地清空
  • copy:复制并生成新的集合
  • remove: 移除指定的值,如果删除的值不存在,报错
  • discard:移除集合中指定的值,如果指定的值不存在,不报错
  • pop: 移除一个元素,是按哈希序列顺序从左移除
#add: 向集合里添加数据,注意集合里没有顺序,所以没有append和insert方法
s = {1}
s.add(333)
print(s)

# copy 拷贝
# clear 原地清空
s = {1,2,3,4}
print(id(s))
s.clear()

print(id(s))
print(s)

# discard:移除集合中指定的值,如果指定的值不存在,不报错
s = {2,3,4,6,8,3}
s.discard(2)
print(s)

print("*" * 30)
s.discard(100)
print(s)

# remove:移除指定的值,如果删除的值不存在,报错
# s.remove(100)   #这里会报错
print(s)
# pop:按哈希序列从左边移除一个元素
s = {'a','b','c',1,2,3,4,5,6}
print(s)

s.pop()
print(s)
s.pop()
print(s)
s.pop()
print(s)

print("*" * 20)
s = {('a','b'),('c','d'),('e','f')}
print(s)

s.pop()
print(s)
s.pop()
print(s)
s.pop()
print(s)

运行结果:
{1, 333}
77023944
77023944
set()
{3, 4, 6, 8}


{3, 4, 6, 8}
{3, 4, 6, 8}
{1, 2, 3, ‘b’, 4, 5, ‘c’, 6, ‘a’}
{2, 3, ‘b’, 4, 5, ‘c’, 6, ‘a’}
{3, ‘b’, 4, 5, ‘c’, 6, ‘a’}
{‘b’, 4, 5, ‘c’, 6, ‘a’}


{‘bbbb’, ‘cccc’, ‘dddd’, ‘aaa’}
{‘cccc’, ‘dddd’, ‘aaa’}
{‘dddd’, ‘aaa’}
{‘aaa’}
{(‘c’, ‘d’), (‘a’, ‘b’), (‘e’, ‘f’)}
{(‘a’, ‘b’), (‘e’, ‘f’)}
{(‘e’, ‘f’)}
set()

两个集合的数学操作

  • 集合不支持 + -
  • intersection: 交集
  • difference: 差集
  • unionn: 并集
  • issubset:检查一个集合是否另外一个集合的子集
  • issuperset: 检查一个集合是否是另外一个集合的超集
# 俩个集合操作的函数
s1 = {1,2,3,4,5,6}
s2 = {5,6,7,8,9}

# intersection: 交集
#s1和s2的公共部分
print(s1.intersection(s2))
print(s2.intersection(s1))

# difference: 差集
#s1中去掉s2的元素,剩下的集合
print(s1.difference(s2))
#s2中去掉s1中的元素,剩下的集合
print(s2.difference(s1))

# unionn: 并集, 两个集合元素之和,注意去重
print(s1.union(s2))


# issubset:检查一个集合是否另外一个集合的子集
print(s1.issubset(s2))

# 一个集合a是另外一个集合b的子集, 说明a中的元素同时也是b中的元素,issubset,简称a是b的子集,同时b是a的超集
print("*" * 20)
s3 = {2,3}
print(s3.issubset(s1))
print(s1.issuperset(s3))

输出结果:
{5, 6}
{5, 6}
{1, 2, 3, 4}
{8, 9, 7}
{1, 2, 3, 4, 5, 6, 7, 8, 9}
False


True
True

冰冻集合(frozen set)

  • 不可以修改元素的集合
  • 集合list和冰冻集合(frozen set) 的关系类似于列表list和元组tuple的关系
# 创建冰冻集合
s = frozenset()
print(type(s))

s1 = {1,2,3,4,5,6}
s2 = frozenset(s1)
print(type(s2))

猜你喜欢

转载自blog.csdn.net/bruesz/article/details/82883029