集合 及 作业

集合

  1. 什么是集合(set)

    """
    集合是容器型数据类型;将{}作为容器的标志,多个元素之间用逗号隔开:{元素1, 元素2, 元素3, ...}
    集合是可变的;集合是无序的
    元素:必须是不可变的数据;元素是唯一的
    """
    # 空集合: {}不是空集合,是空字典
    set1 = set()
    print(type(set1), len(set1))    # <class 'set'> 0
    
    # 集合是无序的
    print({1, 2, 3} == {3, 1, 2})    # True
    
    # 集合的元素必须是不可变的类型的数据(数字, 字符串, 元组)
    set2 = {23, 'abc', (2, 3)}
    print(set2)
    
    # set3 = {23, 'abc', [2, 3]}        # 报错!
    # print(set3)
    
    # 集合的元素是唯一的
    set4 = {10, 20, 30, 10, 10}
    print(set4)     # {10, 20, 30}
    
    # 集合自带去重功能,但是只能去元素是不可变的序列的重
    names = ['张三', '李四', '张三', '王二', '李四', '张三']
    print(set(names))
    #{'张三', '王二', '李四'}
    
  2. 集合的增删改查

    1. 查: 集合只能遍历

      boll = {'乒乓球', '篮球', '羽毛球', '高尔夫', '网球'}
      for x in boll:
          print(x)
      
    2. boll = {'乒乓球', '篮球', '羽毛球', '高尔夫', '网球'}
      
      # 集合.add(元素)    -   在集合中添加指定元素
      boll.add('足球')
      print(boll)  #{'乒乓球', '篮球', '羽毛球', '高尔夫', '网球', '足球'}
      
      # 集合.update(序列)    -    将序列中的元素全部添加到集合中
      set5 = set()
      set5.update('abc')
      print(set5)    # {'a', 'b', 'c'}
      
      set5.update({'name': '小明', 'age': 18})
      print(set5)   # {'name', 'c', 'age', 'b', 'a'}
      
    3. boll = {'乒乓球', '篮球', '羽毛球', '高尔夫', '网球'}
      boll.remove('高尔夫')
      print(boll)   # {'网球', '羽毛球', '乒乓球', '篮球'}
      
      boll.discard('网球')
      print(boll)     # {'乒乓球', '羽毛球', '篮球'}
      
      # boll.remove('桌球')     # KeyError: '桌球'
      boll.discard('桌球')      # 不会报错
      
    4. 改 - - - 不能直接修改某个元素,只能先删除再添加

  3. 数学集合运算:交集、并集、差集、对称差集、子集和真子集

    s1 = {1, 2, 3, 4, 5, 6, 7}
    s2 = {5, 6, 7, 8, 9}
    # 1)交集:&
    # 集合1 & 集合2     -    获取两个集合公共的部分
    print(s1 & s2)      # {5, 6, 7}
    
    # 2)并集:|
    print(s1 | s2)      # {1, 2, 3, 4, 5, 6, 7, 8, 9}
    
    # 3)差集:-
    # 集合1 - 集合2     -    获取在集合1中但是不在集合2中的所有的元素
    print(s1 - s2)     # {1, 2, 3, 4}
    print(s2 - s1)     # {8, 9}
    
    # 4)对称差集: ^
    # 集合1 ^ 集合2   - 获取只在集合1和只在集合2中的所有的元素
    print(s1 ^ s2)     # {1, 2, 3, 4, 8, 9}
    
    # 5)子集和真子集
    # 集合1 >= 集合2      -     判断集合2是否是集合1的子集
    # 集合1 > 集合2       -     判断集合2是否是集合1的真子集
    print({100, 200, 300} >= {1, 2})          # False
    print({1, 2, 3, 100, 200} >= {1, 2})      # True
    
  4. 集合相关操作

    # 1) in 和 not in
    print(10 in {10, 20, 30})    # True
    
    # 2)max、min、sorted、sum、set、len
    print(max({10, 3, 94}))                 # 94
    print(sorted({23, 9, 89, 67, 34}))      # [9, 23, 34, 67, 89]
    print(sum({23, 45, 78, 9}))             # 155
    
    print(len({23, 34, 56, 23, 23}))        # 3
    

作业

1.用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)
a. 求选课学生总共有多少人
b. 求只选了第一个学科的人的数量和对应的名字
c. 求只选了一门学科的学生的数量和对应的名字
d. 求只选了两门学科的学生的数量和对应的名字
e. 求选了三门学生的学生的数量和对应的名字

math = {'小明', '小峰', '小城'}
english = {'小程', '小峰', '小宏', '小陶'}
act = {'小程', '小陶', '小峰', '小宏'}

# a.求选课学生总共有多少人
people = math | english | act
print('选课的总共有%d人'%(len(people)))

# b. 求只选了第一个学科的人的数量和对应的名字

for i in math:
    print(i)
print('只选了第一个学科的人的数量', len(math))

# c. 求只选了一门学科的学生的数量和对应的名字

one_people = (math ^ english ^ act ) - (math & english & act)
for i in one_people:
    print(i)
print('选择一门的学生数量:', len(one_people))



# d. 求只选了两门学科的学生的数量和对应的名字

two_people = (math & english) ^ (english & act)
for i in two_people:
    print(i)

print('选择二门的学生数量:', len(two_people))


# e. 求选了三门学生的学生的数量和对应的名字

three_people = math & english & act
for i in three_people:
    print(i)
print('选择三门的学生数量:', len(three_people))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值