什么是字典(dict)

字典是容器型数据类型;将{}作为容器的标志,里面多个元素(元素是键值对)用逗号隔开:{键1:值1,键2:值2,键3:值3…}
字典的元素:必须是键值对;
键 - 必须是不可变数据,一般用字符串。(功能是对值进行说明)
值 - 任何类型的数据都可以,可以重复。(值才是字典真正的想要保存的数据)
字典是可变的(支持增删改);字典是无序的(不支持下标)

空字典:

d1 = {}
print(type(d1))  # <class 'dict'>

键不可变
键是唯一的

字典的增删改查

1.查 - 获取字典的值
1)查单个值
字典[key] - 获取字典中指定key对应的值;如果key不存在会报错
字典.get(key) - 获取字典中指定key对应的值,如果key不存在不会报错,把None返回
字典.get(key,默认值) - 获取字典中指定key对应的值,如果key不存在不会报错,把默认值返回

dog = {'name': '小白', 'sex': '母', 'color': '黄色'}
print(dog['name'])  # 小白
# print(dog['height'])  # 会报错
print(dog.get('name'))  # 小白
print(dog.get('height'))  # None
print(dog.get('height', 0))  # 0

2)遍历
for 变量 in 字典:
循环体
注意:变量取到的是字典的每个key

for x in dog:
    print('x', x, dog[x])
练习:
 1)统计班级中不及格学生的人数
 2)计算所有学生的平均分
classes = [
    {'name': '小明', 'age': 26, 'score': 90, 'sex': '男'},
    {'name': '小红', 'age': 13, 'score': 89, 'sex': '女'},
    {'name': '小芳', 'age': 22, 'score': 77, 'sex': '女'},
    {'name': '小军', 'age': 34, 'score': 56, 'sex': '男'},
    {'name': '小黑', 'age': 15, 'score': 34, 'sex': '男'},
    {'name': '小白', 'age': 20, 'score': 70, 'sex': '男'}
]
q = 0
sums = 0
for x in classes:
    if x['score'] < 60:
        q += 1
    sums += x['score']
print('不及格人数是{},平均分是{}'.format(q, sums / len(classes)))

2.增/改 - 添加键值对/修改键对应的值
1)字典[key] = 值 - 如果key不存在就是添加key值;如果key存在就是修改指定key对应的值。

dogs = {'name': '小白', 'sex': '母', 'color': '黄色'}
print(dogs)
# 增加
dogs['height'] = 100
print(dogs)
2)字典.setdefault(key,value) - 添加键值对
dogs.setdefault('age', 18)
print(dogs)
dogs.setdefault('name', '小黑')  # 存在就不改,不添加

3.删 - 删除键值对
1)del字典[key] - 删除指定key对应的键值对

del dogs['age']
print(dogs)
2)字典.pop(key) - 取出指定key对应的值,并且返回key对应的值
dogs.pop('height')
print(dogs)
字典的相关操作

1.运算符
字典不支持+、-、*、>、<、>=、<=,只支持==和!=
2.in和not in
key in 字典 - 判断字典中是否存在指定的key
3.相关函数
(了解)sum,max,min,sorted - 针对的操作对象是字典的key
1) len(字典) - 获取字典中键值对的个数
2)dict(数据) - 将指定数据转换成字典
数据 - a.数据本身是序列 b.序列中的每一个元素是小序列c.小序列中元素的个数是2 d.小序列的第一个元素不可变
字典转列表 - 将字典的key作为列表元素(元组也是一样的)

字典的相关方法

1.字典.clear() - 清空字典
2.字典.copy() - 赋值字典产生一个一模一样的新字典并返回
3.dict.fromkeys(序列,值) - 创建一个新字典,
将序列中元素作为字典的key,每个key对应的值就是指定值

d1 = dict.fromkeys('abc', 100)
print(d1)  # {'a': 100, 'b': 100, 'c': 100}

4.字典.items() - 同时获取字典的key和value,将字典转换成一个序列,
序列中的元素是每个键值对对应的小序列

dog = {'name': '小白', 'sex': '母', 'color': '黄色'}
print(dog.items())  # dict_items([('name', '小白'), ('sex', '母'), ('color', '黄色')])
遍历字典的时候同时获取键和值
for k, v in dog.items():
    print(k, v)
练习:通过列表推导式交换一个字典得key和Value的位置
new_dog = [(v, k) for k, v in dog.items()]
print(dict(new_dog))  # {'小白': 'name', '母': 'sex', '黄色': 'color'}

new_dog2 = [(dog[k], k)for k in dog]
print(new_dog2)

5.字典.keys() - 获取字典所有的key
6.字典.values() - 获取字典所有的值(返回一个序列)
7.字典.update(序列) - 将序列中所有的元素以键值对的形式添加到字典,序列:必须是可以转换成字典的序列

dog.update(new_dog2)
print(dog)  # {'name': '小白', 'sex': '母', 'color': '黄色', '小白': 'name', '母': 'sex', '黄色': 'color'}

集合

1.什么是集合
容器:将{}作为容器的标志,多个元素用逗号隔开:{元素1,元素2,元素3,…}
元素:不可变的,唯一的 (集合自带去重)
可变的:无序的
1)空集合 set()
{}是空字典

s1 = set()
print(type(s1), len(s1))  # <class 'set'> 0
2)集合元素不可变
3)集合元素是唯一的

2.数学集合运算:并集(|),交集(&),差集(-),对称差集(^),子集(>=),真子集(>)
1)并集 - A和B的并集是将A和B的元素放到一起构成的新集合

A = {1, 2, 3, 4, 5, 6}
B = {7, 8, 9, 10, 1, 2, 3}
C = A | B
print(C)  # {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
2)A和B的交集,写作A&B,是既属于A的、又属于B的所有元素组成的集合
C = A & B
print(C)  # {1, 2, 3}

3)差集 - 两个集合可以相’减’,写作B-A,是属于B的、但不输入A的所有元素组成的集合。

C = A - B
print(C)  # {4, 5, 6}
C = B - A
print(C)  # {8, 9, 10, 7}
4)对称差集 - 在集合A和集合B中,只包含在A中和只包含在B中的元素的集合
C = A ^ B
print(C)  # {4, 5, 6, 7, 8, 9, 10}
5)子集  >=  判断是否是子集; > 判断是否是真子集
A = {1, 2, 3, 4, 5, 6}
B = {7, 8, 9, 10, 1, 2, 3}
C = {1, 2}
print(A >= C)  # True
print(A > C)  # True