python set集合

   1,python的基本数据类型

 python基本数据类型包括,Number(数字类型),String(字符串类型),Bool(布尔类型),List(数组类型),Tuple(元组类型),Set(集合类型),Dict(字典类型)

以上类型,分为两类:

可变类型:List(列表)、Dictionary(字典)、Set(集合)。

不可变类型:Number(数字)、String(字符串)、Tuple(元组)

注意:Tuple(元组)是不可变类型

2, Set集合类型

set集合是无序、可变的数据类型,用于存储唯一的数据。

2.1 初始化

 可以使用{}或者set()来初始化一个集合对象。集合使用大括号 {} 表示,元素之间用逗号 "," 分隔。或者使用set()来初始化。

集合名 = {元素1 , 元素2 , 元素3 , ... ...}

集合名 = set( 元素 )

但是,初始化一个空集合对象,必须使用set(),因为{}是用来初始化一个空dict对象的。

s1 = {1,2,3,4}
print(s1)

s2=set([1,2,3,4])
s3=set((1,2,3,4))#注意是双括号,(1,2,3,4)表示元祖
s4=set("nihao")
print(s2)
print(s3)
print(s4)
{1, 2, 3, 4}
{1, 2, 3, 4}
{1, 2, 3, 4}
{'n', 'o', 'h', 'i', 'a'}

2.2 集合的特点

2.2.1  集合元素的不可变性

 创建集合时候,元素必须是不可变的,即可hash的。集合,字典都是可变类型,不可hash。

s7 = {"python", [1,2,3,4], {"name":"lily","age":22},100}
print(s7)

TypeError: unhashable type: 'list'
 

s8 = {"python", {"name":"lily","age":22},100}
print(s8)

 TypeError: unhashable type: 'dict'

2.2.2 集合的元素不能重复

l1=[3,4,5,6,7,8,9,10,10,10]
s4=set(l1)
print(s4)

{3, 4, 5, 6, 7, 8, 9, 10}

应用:list去重

list1 = [3,6,3,4,5,5,5,6,7]
new_list = list(set(list1))
print("list1去重后:",new_list)

 2.2.3 集合具有可变性

s9 = {"python", 2,100}
print(hash(s9))

TypeError: unhashable type: 'set'

 2.2.4 集合中的元素是无序的

无法使用索引来访问元素。可以使用 for 循环遍历 set 项目,或者使用 in 关键字查询集合中是否存在指定值。

fruit = {'apple', 'banana', 'cherry'}
for key in fruit:
    print(key)

cherry
banana
apple

print('banana' in fruit)

true

2.3 集合的运算

 两个集合之间的计算有4种,分别是-|&、^、- 

2.3.1 - 差集运算

 a-b表示在a集合中不在b集合中的元素 

a = set('abcdefg') 
b = set('abgt')
print(a - b) 

 {'d', 'f', 'e', 'c'}

2.3.2 | 运算

a | b 在a中或者在b中的元素
a = set('abcdefg') 
b = set('abgt')
print(a | b) 

{'e', 'g', 'c', 'a', 'd', 'f', 't', 'b'}

2.3.3 & 运算

 a & b 在a中且又在b中的元素,两个集合都包含的元素

a = set('abcdefg') 
b = set('abgt')
print(a & b)

  {'a', 'b', 'g'}

2.3.4 ^ 运算(异或) 

a^b   不同时包含集合 a 和集合 b 的元素,即除去a中和b中相同的元素

a = set('abcdefg') 
b = set('abgt')
print(a ^ b)

{'e', 'c', 'd', 'f', 't'}

a^b和b^a是相同的结果

a = set('abcdefg')
b = set('abgt')
print((a^b)==(b^a))
print(id(a^b))
print(id(b^a))

 True
2296758348928
2296758348928

 2.4 集合方法

通过dir(set)查看集合方法

['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']
 

2.4.1 增加元素 add()

s1=set("abcd")
s1.add("e")
print(s1)  #{'b', 'a', 'c', 'd', 'e'}

 list是unhash的可变类型,不可添加


l1=[1,2,3]
s1.add(l1) # TypeError: unhashable type: 'list'
tuple1=tuple(l1)
s1.add(tuple1)
print(s1) #{'b', 'd', (1, 2, 3), 'a', 'e', 'c'}

 2.4.2 更新集合中的元素update(),union()

 s2.update(s3), s2update,加入s3的元素,s3不改变。重复的元素会呗忽略,只会出现一次。

s2 = set(["python","java","c"])
s3 = set(["python","go","javascript","html"])
s2.update(s3)
print(s2) #{'html', 'python', 'c', 'go', 'java', 'javascript'}
print(s3) # {'html', 'python', 'go', 'javascript'}

set.union(set1,set2,....)合并两个或者多个集合,结果去重。会生成新的对象,原集合不会改变。

s2 = set(["python","java","c"])
s3 = set(["python","go","javascript","html"])
s4 = set(["C#","C++"])
s5=s2.union(s3,s4)
print(s5) #{'html', 'C#', 'python', 'c', 'C++', 'java', 'javascript', 'go'}
print(s2) #{'java', 'python', 'c'}
print(s3) # {'html', 'python', 'javascript', 'go'}
print(s4)  #{'C#', 'C++'}

2.4.3 删除元素 remove(),discard(),pop()

remove()方法用于移除集合中指定元素

s4 = set(["python","java","c"])
s4.remove("java")
print(s4) #{'c', 'python'}

remove移除不存在的元素会报错

s4 = set(["python","java","c"])
s4.remove("C#")
print(s4) #KeyError: 'C#'

 discard() 用于移除集合中的元素,若是元素不存在,不会报错。

s4 = set(["python","java","c"])
s4.discard("java")
print(s4) #{'python', 'c'}

discard()移除不存在的元素,不会报错。

s4 = set(["python","java","c"])
s4.discard("C#")
print(s4) #{'python', 'c', 'java'}

 pop() 随机移除一个元素。体现随机性,比如以下代码,多次运行结果是不一样。

s4 = set(["python","java","c"])
s4.pop()
print(s4) #{'c', 'python'} 
          #{'c', 'java'}

 pop方法无参数值,不能指定删除元素。带参数后报错:pop() takes no arguments 

s4.pop("C#")  # pop() takes no arguments 

2.4.4 清空集合 clear(),del 

 clear是清空集合中的元素,内存地址不会删。clear后再打印,会打印一个空集合。

s4 = set(["python","java","c"])
s4.clear()
print(s4) #set()

del是删除集合,内存地址会删除。del后再打印会报错 not defined 

s4 = set(["python","java","c"])
del s4
print(s4) #NameError: name 's4' is not defined

2.4.5 异或 symmertric_difference()、symmertric_difference_update()

 symmertric_difference() 返回两个集合中不重复的元素集合。原集合不改变。

s2 = set(["python","java","c"])
s3 = set(["python","go","javascript","html"])
s4=s2.symmetric_difference(s3)
print(s4) #{'java', 'c', 'html', 'go', 'javascript'}
print(s2) #{'python', 'java', 'c'}

 symmertric_difference_update() 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。

s2 = set(["python","java","c"])
s3 = set(["python","go","javascript","html"])
s4=s2.symmetric_difference_update(s3)
print(s4) #None
print(s2) #{'java', 'c', 'html', 'javascript', 'go'}
print(s3) #{'html', 'go', 'javascript', 'python'}

 symmertric_difference()、symmertric_difference_update()区别是在与是否返回集合对象,是否改变调用集合。

2.4.6 差集 difference()、difference_update()

difference()返回集合的差集,消去调用集合的在参数集合内的元素。

注意跟异或的区别是,异或的结果可能来自两个集合,但是差集的结果来自被调用的集合。

s2 = set(["python","java","c"])
s3 = set(["python","go","javascript","html"])
s4=s3.difference(s2)
print(s4) #{'html', 'go', 'javascript'}
print(s3) #{'html', 'python', 'javascript', 'go'}
print(s2) #{'python', 'c', 'java'}

 difference_update() 移除当前集合中在指定集合中也存在的元素,注意是直接作用在当前集合上的。

s2 = set(["python","java","c"])
s3 = set(["python","go","javascript","html"])
s4=s3.difference_update(s2)
print(s4) # None
print(s3) #{'go', 'javascript', 'html'}
print(s2) #{'java', 'c', 'python'}

2.4.7 交集 intersection()、intersection_update() 

intersection() 集合交集运算,返回相同的元素。
s2 = set(["python","java","c"])
s3 = set(["python","go","javascript","html"])
s4=s3.intersection(s2)
print(s4) #{'python'}
print(s3) #{'html', 'go', 'javascript', 'python'}
print(s2) #{'java', 'c', 'python'}

 intersection_update() 无返回值,直接作用在集合上。

s2 = set(["python","java","c"])
s3 = set(["python","go","javascript","html"])
s4=s3.intersection_update(s2)
print(s4) #None
print(s3) #{'python'}
print(s2) #{'java', 'python', 'c'}

2.4.8 子集issubset() 与 父集(超集)issuperset()

 A如果是B的子集,也就说A的元素全部在B中。那么B就是A的超集。

s2 = set(["python","go","html"])
s3 = set(["python","go","c"])
s4 = set(["python","go","javascript","html"])
print(s2.issubset(s4)) #True
print(s3.issubset(s4)) #False
print(s4.issuperset(s2)) #True
print(s4.issuperset(s3)) #False

2.4.9 isdisjoint() 判断两个集合是否包含相同的集合

s2 = set(["python","go","html"])
s3 = set(["python","go","c"])
s4 = set(["c++","c#","html"])
print(s2)  #{'html', 'go', 'python'}
print(s3)  # {'go', 'c', 'python'}
print(s4)  #{'html', 'c++', 'c#'}
print(s2.isdisjoint(s3)) #False
print(s3.isdisjoint(s4)) #True

注意:有相同元素是False,无相同元素是True

 2.4.10 copy()复制

无参数,有返回值

s2 = set(["python","go","html"])
s3=s2.copy()
print(s3) #{'python', 'html', 'go'}
s3.add("c#")
print(s3) # {'c#', 'python', 'html', 'go'}
print(s2) # {'python', 'html', 'go'}

2.4.11 frozenset

f_set=frozenset(("python","java","c"))
s1=set(("python","java","c"))
print(f_set) #frozenset({'java', 'c', 'python'})
print(s1)    #{'java', 'c', 'python'}

dir查看集合方法,发现frozenset少了集合增添改动的方法

print(dir(f_set))

['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'copy', 'difference', 'intersection', 'isdisjoint', 'issubset', 'issuperset', 'symmetric_difference', 'union']
 

print(dir(s1))

['__and__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__iand__', '__init__', '__init_subclass__', '__ior__', '__isub__', '__iter__', '__ixor__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__or__', '__rand__', '__reduce__', '__reduce_ex__', '__repr__', '__ror__', '__rsub__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__xor__', 'add', 'clear', 'copy', 'difference', 'difference_update', 'discard', 'intersection', 'intersection_update', 'isdisjoint', 'issubset', 'issuperset', 'pop', 'remove', 'symmetric_difference', 'symmetric_difference_update', 'union', 'update']

print("in using in f_set")
for s in f_set:
    print(s)
print("in using in s1")
for ss in s1:
    print(ss)

均可打印出内容

in using in f_set
java
c
python
in using in s1
java
c
python

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值