day8-字典和集合

字典的增删改

1.增和改

字典[键] = 值 - 当键存在的时候是修改键对应的值;当键不存在的是添加键值对

cat = {'name': '美美', 'age': 2, 'color': '白色'}
print(cat) # {'name': '美美', 'age': 2, 'color': '白色'}
# 添加
cat['breed'] = '蓝猫'
print(cat)  # {'name': '美美', 'age': 2, 'color': '白色', 'breed': '蓝猫'}
# 修改
cat['age'] = 3
print(cat)	# {'name': '美美', 'age': 3, 'color': '白色', 'breed': '蓝猫'}
# 添加 没有就加 有不变(重要方法)
cat.setdefault('weight',8)
cat.setdefault('age',4)
print(cat) # {'name': '美美', 'age': 3, 'color': '白色', 'breed': '蓝猫', 'weight': 8}
  1. 删 - 删除键值对

del 字典[键] - 删除字典中指定键对应的键值对(如果键不存在会报错)

字典.pop(键) - 取出字典中指定键对应的值

  1. 相关操作

字典不支持+、*,也不支持比较大小的运算符,只支持==、!=

in 和 not in - 字典的in 和 not in判断的是键是否存在

  • 键 in 字典
  • 键 not in 字典
  1. 相关函数

len

dict(数据) - 1)数据本身是一个序列

​ 2)序列中的元素必须是有且只有两个元素的小序列

​ 3)小序列的第一个元素必须是不可变的数据

data = [('a', 10), ('b', 20)]
print(dict(data))

data2 = ['ab', range(2), [10,20]]
print(dict(data2))

字典转换成列表/元组

dic2 = {'a':10, 'b':20, 'c':30}
print(list(dic2))		# ['a', 'b', 'c']
  1. 字典相关方法

    字典.clear() - 清空字典

    字典.copy - 复制原字典产生一个一摸一样的新字典

    字典.update(序列) - 将序列中所有的元素都添加到字典中(如果本身就存在就会覆盖)。序列必须是字典或者能够转换成字典的序列

    字典.keys() - 遍历字典的返回一个序列

    字典.value() - 遍历字典的返回一个序列

    字典.items()

  2. 字典推导式

{键的表达式:值的表达式 for 变量 in 序列}

{键的表达式:值的表达式 for 变量 in 序列 if 条件语句}

# 练习:通过字典的推导式交换一个字典的键和值
dict1 = {'a':0,'b':20}
dict2 = {dict1[x]:x for x in dict1}
print(dict2)

集合(set)

集合是容器;将{}作为容器的标志,多个元素用逗号隔开:{元素1,元素2,元素3,…}

集合是可变的;集合是无序;

元素:不可变的数据、元素是唯一的(具备自动去重的功能)

1)空集合

set1 = set()
print(type(set1),len(set1))	# <class 'set'> 0

2)集合是无序

print({1, 2, 3} == {3, 2, 1}) # True

3)元素必须是不可变的数据

set2 = {1, 'abc', (2, 3)}
print(set2) # {(2, 3), 1, 'abc'}

set3 = {1, 'abc', [2, 3]}
print(set3) #报错

4)元素是唯一的

set4 = {1, 2, 3, 1, 1, 2}
print(set4)				# {1, 2, 3}

集合元素的增删改查

1)查 - 遍历

​ for 变量 in 集合:
​ 循环体

nums = {23, 90, 89, 78}
for x in nums:
    print(x)

2)增

集合.add(元素) - 在集合中添加指定元素

集合.update(序列) - 将序列中的元素全部添加到集合中

nums.add(45)
print(nums)
nums.update('abc')
print(nums)	# {'c', 'a', 45, 78, 23, 89, 90, 'b'}

3)删除

集合.remove(元素) - 删除指定元素,元素不存在报错

集合.discard(元素) - 删除指定元素,元素不存在不会报错

nums.remove(89)
print(nums)
nums.discard(90)

4)改 - 集合无法直接修改元素的值,如果非要改就将要改的元素删除,添加新的元素

数学集合运算

&(交集)、|(并集)、-(差集)、^(对称差集)、>/<(真子集)、>=/<=(子集)

nums1 = {1, 2, 3, 4, 5, 6, 7}
nums2 = {5, 6, 7, 8, 9}

1)集合&集合2 - 获取两个集合的公共元素(获取既在集合1里面又在集合2里面的元素)

print(nums1 & nums2)	# {5, 6, 7}

2)集合1|集合2 - 获取两个集合所有元素

print(nums1 | nums2)		# {1, 2, 3, 4, 5, 6, 7, 8, 9}

3)集合1 - 集合2 - 获取集合1中除了包含在集合2中以外的部分

print(nums1 - nums2)  # {1, 2, 3, 4}
print(nums2 - nums1)  # {8, 9}

4)集合1 ^ 集合2 - 将两个集合合并,去掉公共部分

print(nums1^nums2) # {1, 2, 3, 4, 8, 9}

5)子集(有可能相等)和真子集(真的比它小)

集合1 > 集合2 ->判断集合2是否是集合1的真子集

print({10, 20, 30, 40} > {1, 2})	# False
print({10, 20, 30, 40} > {10, 40})	# True
print({10, 20, 30, 40} > {10, 20, 30, 40})	# False
print({10, 20, 30, 40} >= {10, 20, 30, 40})	# True

作业

  1. 定义一个列表,在列表中保存6个学生的信息(学生信息中包括: 姓名、年龄、成绩(单科)、电话、性别(男、女、不明) )

    list1 = [
        {'name': 'stu1', 'age': 18, 'score': 60, 'tel': '123', 'gender': '男'},
        {'name': 'stu2', 'age': 17, 'score': 70, 'tel': '321', 'gender': '男'},
        {'name': 'stu3', 'age': 16, 'score': 50, 'tel': '456'},
        {'name': 'stu4', 'age': 19, 'score': 40, 'tel': '645', 'gender': '女'},
        {'name': 'stu5', 'age': 20, 'score': 90, 'tel': '654'},
        {'name': 'stu6', 'age': 21, 'score': 90, 'tel': '778', 'gender': '女'}
    ]
    
    1. 统计不及格学生的个数

      count = 0
      for x in list1:
          if x['score'] < 60:
              count += 1
      print(count)   # 2
      
    2. 打印不及格学生的名字和对应的成绩

      for x in list1:
          if x['score'] < 60:
              print(x['name'], x['score'])
      # stu3 50
      # stu4 40
      
    3. 打印手机尾号是8的学生的名字

      for x in list1:
          if int(x['tel']) % 10 == 8:
              print(x['name'])		# stu6
      
    4. 打印最高分和对应的学生的名字

      max1 = list1[0]['score']
      list2 = []
      for x in list1:
          if x['score'] == max1:
              list2.append([x['score'], x['name']])
          if x['score'] > max1:
              max1 = x['score']
              list2.clear()
              list2.append([x['score'], x['name']])
      print(list2)			# [[90, 'stu5'], [90, 'stu6']]
      
    5. 删除性别不明的所有学生

      for x in list1.copy():
          if x.get('gender', 0) == 0:
              list1.remove(x)
      print(list1)
      
    6. 将列表按学生成绩从大到小排序(挣扎一下,不行就放弃)

      list2 = []
      list3 = []
      for x in list1:
          list2.append(x['score'])
      list2.sort(reverse=True)
      for x in list2:
          for i in list1:
              if i['score'] == x and i not in list3:
                  list3.append(i)
      print(list3)
      
  2. 用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)

    set1 = {'stu1', 'stu2', 'stu3', 'stu4', 'stu5', 'stu6'}
    set2 = {'stu3', 'stu4', 'stu5', 'stu6', 'stu7', 'stu8'}
    set3 = {'stu5', 'stu6', 'stu7', 'stu8', 'stu9', 'stu10'}
    
    1. 求选课学生总共有多少人

      print(len(set1 | set2 | set3))	# 10 
      
    2. 求只选了第一个学科的人的数量和对应的名字

      set4 = set1 - (set1 & set2 | set3)
      print(len(set4), set4)	# 2 {'stu2', 'stu1'}
      
    3. 求只选了一门学科的学生的数量和对应的名字

      set5 = (set1|set2|set3)-((set1 & set2)| (set2&set3) |(set1&set3))
      print(len(set5), set5)	# 4 {'stu9', 'stu2', 'stu10', 'stu1'}
      
    4. 求只选了两门学科的学生的数量和对应的名字

      set6 = ((set1 & set2)| (set2&set3) |(set1&set3)) - (set1&set2&set3)
      print(set6)
      
    5. 求选了三门学生的学生的数量和对应的名字

set7 = set1 & set2 & set3
print(len(set7), set7)		# 2 {'stu5', 'stu6'}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值