集合(set)– 字典的近亲
集合的两大功能:
集合可以实现去重的功能 集合可以实现关系测试; 交集, 差集,并集, 是否子集, 是否没有交集
集合(set)的定义
集合是不重复的数据结构 如果花括号里面为空,则是字典类型
s = { }
print type (s)
#<type 'dict' >
s = {1 ,2 ,3 ,4 }
print type (s)
#<type 'set' >
s = set ()
print type(s)
#<type 'set' >
s = set ([1 ,2 ,3 ,1 ,2 ,3 ])
print s
#set ([1 , 2 , 3 ])
s = set ("hello" )
print s
#set (['h' , 'e' , 'l' , 'o' ])
s = set ((1 ,2 ,3 ,4 ,5 ))
print s
#set ([1 , 2 , 3 , 4 , 5 ])
s = set ({'a' :1 , 'b' :2 , 'c' :3 })
#set (['a' , 'c' , 'b' ])
集合的特性
集合是无序的, 不重复的数据类型; 因此不支持索引,也不支持切片;也不支持重复;也不支持连接; 支持成员操作符; 支持for循环;
s = {1 , 2 , 3 , 4 , 1 , 2 }
print 1 in s
print 2 not in s
s = {1 ,2 ,3 ,2 ,1 ,5 ,6 }
for i in s :
print i ,
集合的增删改查
增加
s = {1 ,2 ,3 ,4 ,1 ,2 ,3 }
print s
#set([1, 2, 3, 4])
s.add(1 )
#set([1, 2, 3, 4])
s.add(7 )
print s
#set([1, 2, 3, 4, 7])
s = {1 ,2 ,3 ,2 ,1 ,5 ,6 }
s1 = {'a' , 'b' , 'c' }
s.update(s1)
print s
#set (['a' , 1 , 2 , 3 , 5 , 6 , 'c' , 'b' ])
查找(关系测试操作)
s1 = {1 , 2 , 3 , 4 }
s2 = {1 , 2 , 3 , 5 }
# 交集
print s1 & s2
#set([1, 2, 3])
# 并集
print s1 | s2
#set([1, 2, 3, 4, 5])
# 差集
print s1 - s2
#set([4])
print s2 - s1
#set([5])
# 对等差分
print s1 ^ s2
#set([4, 5])
s1 = {1 , 2 , 3 , 4 }
s2 = {1 , 2 , 3 , 5 }
# 交集
print s1.intersection(s2)
#set([1, 2, 3])
# 并集
print s1.union(s2)
#set([1, 2, 3, 5])
# 差集
print s1.difference(s2)
#set([4])
print s2.difference(s1)
#set([5])
# 对等差分
print s1.symmetric_difference(s2)
#set([4, 5])
#补充update
s1 = {1 , 2 , 3 , 4 }
s2 = {1 , 2 , 3 , 5 }
print s1.intersection_update(s2)
#set([1, 2, 3])
删除
s = {'a' ,'hello' , 'redhat' , 'b' , 18 , 33 , 4 , 1 , 2 , 7 , 6 , 5 }
print s
#set (['a' , 1 , 2 , 'b' , 4 , 5 , 6 , 7 , 18 , 'redhat' , 33 , 'hello' ])
print s.pop()
#a
remove( ) 删除集合指定元素, 如果不存在,则报错
s = {'alice' ,'hello' , 'westos' , 'b' , 18 }
s.remove('alice' )
print s
#set ([18 , 'b' , 'westos' , 'hello' ])
discard( ) 删除集合指定元素, 如果不存在,则do nothing
s = {'alice' ,'hello' , 'westos' , 'b' , 18 }
s.discard("a" )
print s
#set ([18 , 'b' , 'westos' , 'alice' , 'hello' ])
s = {'alice' ,'hello' , 'westos' , 'b' , 18 }
s.clear()
print s
应用:
(华为机试题)题目描述 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性, 他先用计算机生成了N个1到1000之间的随机整数(N≤1000), N是用户输入的,对于 其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应 着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺 序去找同学做调 查。请你协助明明完成“去重”与“排序”的工作; 提示:
#生成随机数
import random
random .randint(1 ,1000 )
#列表的去重
import random
s = set ()
N = input('输入一个数:' )
for i in range (N) :
s.add(random.randint(1 ,1000 ))
# sorted 是内置方法, 用来排序;
print sorted(s)
#通过列表排序
# li = list(s)
# li.sort()
# print li
总结
可变数据类型: 列表, 字典, 集合 不可变数据类型: 数值类型, 字符串, 元组
可变数据类型实现某个功能, 直接改变可变的数据类型; 不可变数据类型实现某个功能,需要将结果赋值给另外一个变量; 是否实现for循环
可迭代数据类型: str, list, tuple, dict, set 不可迭代数据类型:数值类型 是否支持索引,切片, 重复和连接特性
有序的数据类型: str, list, tuple 无序的数据类型: dict, set