python 数据结构--Set(集合)

  • 集合(set)是由一个或数个形态各异的大小整体组成的,构成集合的事物或对象称作元素或是成员。
  • 基本功能是进行成员关系测试和删除重复元素。
  • 可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

1. 创建集合

student = {'Tom', 'Jim', 'Mary', 'Tom', 'Jack', 'Rose'}
print(student)   # 输出集合,重复的元素被自动去掉
{'Jim', 'Rose', 'Mary', 'Jack', 'Tom'}

2. 判断元素是否在集合中

# 成员测试
if 'Rose' in student :
    print('Rose 在集合中')
else :
    print('Rose 不在集合中')
Rose 在集合中

3.集合运算

# set可以进行集合运算
a = set('abracadabra')
b = set('alacazam')
 
print(a)
 
print(a - b)     # a 和 b 的差集
 
print(a | b)     # a 和 b 的并集
 
print(a & b)     # a 和 b 的交集
 
print(a ^ b)     # a 和 b 中不同时存在的元素
{'a', 'd', 'r', 'b', 'c'}
{'b', 'd', 'r'}
{'l', 'm', 'r', 'a', 'd', 'z', 'b', 'c'}
{'a', 'c'}
{'l', 'm', 'r', 'b', 'd', 'z'}
a = set('abracadabra')
b = set('alacazam')
 
print(a)
print(b)
a|b
{'a', 'd', 'r', 'b', 'c'}
{'l', 'm', 'a', 'z', 'c'}
{'a', 'b', 'c', 'd', 'l', 'm', 'r', 'z'}

4.集合判空

a = {1,2,3,4,5}
if len(a)!= 0:
    print("集合不为空")
else:
    print("集合为空")
集合不为空
# 不推荐此种方法判断
a = {1,2,3,4,5}
if not a:
    print("集合空")
else:
    print("集合不为空")
集合不为空

5.集合练习

建立以下两个集合并按要求操作

  • a=set([1,2,3,4,5])
  • b=set([2,4,6,8,10])
  • 求并、交、差、异或、子集
  • 求添加、删除、是否空集
a = set([1,2,3,4,5])
b = set([2,4,6,8,10])
print(a)
print(b)
print(a | b)  #并集
print(a & b)  #交集
print(a - b)  #差
print(a ^ b)  #异或
print(f"a 是 b 的子集吗:{a.issubset(b)}")  
print(f"b 是 a 的子集吗:{a.issuperset(b)}" ) 
c = set([1,2,3])
print(f"c 是 a 的子集吗:{c.issubset(a)}")  
print(f"c 是 a 的子集吗:{a.issuperset(c)}") 

# 添加
a.add(6)
a.add(7)
a.add(8)
a.add(9)
print(a)

# 删除
a.remove(9)
print(a)
 
# 判断集合为空
if len(a)==0:
    print("集合为空。")
else:
    print("集合不为空。")
{1, 2, 3, 4, 5}
{2, 4, 6, 8, 10}
{1, 2, 3, 4, 5, 6, 8, 10}
{2, 4}
{1, 3, 5}
{1, 3, 5, 6, 8, 10}
a 是 b 的子集吗:False
b 是 a 的子集吗:False
c 是 a 的子集吗:True
c 是 a 的子集吗:True
{1, 2, 3, 4, 5, 6, 7, 8, 9}
{1, 2, 3, 4, 5, 6, 7, 8}
集合不为空。

6. 集合的应用实例--推荐电影

# 推荐电影
from random import randrange

# 其它用户喜欢看的电影清单
data = {"user"+str(i):{"film"+str(randrange(1,10)) for j in range(randrange(15))} for i in range(10)}

#待测用户看过的电影
user = {"film1","film2","film3"}

# 查找与待测用户最相似的用户和他喜欢看的电影
similarUser, films = max(data.items(), key=lambda item: len(item[1]&user))

print("历史数据")
for u, f in data.items():
    print(u, f, sep=":")
print("和您最相似的用户是:", similarUser)
print("Ta 最喜欢看的电影是:",films)
print("Ta 看过的电影您没看过的有:",films - user)

历史数据
user0:{'film9', 'film1', 'film7'}
user1:{'film5', 'film1', 'film3', 'film7'}
user2:{'film2'}
user3:{'film9', 'film2', 'film5', 'film4', 'film8', 'film1', 'film3'}
user4:{'film6', 'film9', 'film2', 'film4', 'film8', 'film1', 'film3'}
user5:set()
user6:{'film2'}
user7:{'film4', 'film9', 'film1', 'film2'}
user8:{'film6', 'film9', 'film2', 'film5', 'film4', 'film3', 'film7'}
user9:{'film2', 'film3', 'film5'}
和您最相似的用户是: user3
Ta 最喜欢看的电影是: {'film9', 'film2', 'film5', 'film4', 'film8', 'film1', 'film3'}
Ta 看过的电影您没看过的有: {'film4', 'film9', 'film8', 'film5'}
posted @ 2020-04-09 11:01  sinlearn  阅读(411)  评论(0编辑  收藏  举报