今日总结
一、dict
1、增、改
字典[key] = 值
如果key存在的时候是修改指定key对应的值,当key不存在的时候添加键对值
dog = {'name': '财财', 'age': 2, 'breed': '土狗'}
print(dog) # {'name': '财财', 'age': 2, 'breed': '土狗'}
dog['gender'] = '母狗'
print(dog) # {'name': '财财', 'age': 2, 'breed': '土狗', 'gender': '母狗'}
dog['breed'] = '中华田园犬'
print(dog) # {'name': '财财', 'age': 2, 'breed': '中华田园犬', 'gender': '母狗'}
dog['age'] = 3
print(dog) # {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
2、删
1) del 字典[key]
删除字典中指定key对应的键值对
dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'} del dog['gender'] print(dog) # {'name': '财财', 'age': 3, 'breed': '中华田园犬'}
2) 字典.pop(key)
取出字典中指定key对应的值(对应key也无法保存)
dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'} result = dog.pop('age') print(dog, result) # {'name': '财财', 'breed': '中华田园犬', 'gender': '母狗'} 3
3、字典相关操作
1) 字典不支持 +、*、 和 比较大小,只支持比较是否相等
2) in 和 not in
判断字典中是否存在指定的key
print('a' in {'name': 'a', 'age': 8}) # False 后面的字典中没有'a'这个key
3) dict、len
dict(数据)
将数据转换成字典
- 数据必须是序列
- 序列中元素必须是小序列,而且小序列有且只有两个元素(键值对),第一个元素不可变的
list1 = [(10, 20), 'ab', range(2)] print(dict(list1)) # {10: 20, 'a': 'b', 0: 1}
字典也可转换成列表
dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'} result = list(dog) print(result) # ['name', 'age', 'breed', 'gender'] 字典转列表只取key
len(字典)
计算字典中元素个数
dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'} print(len(dog)) # 4
4、字典推导式
{表达式1:表达式2 for 变量 in 序列}
{表达式1:表达式2 for 变量 in 序列 if 条件语句}
result = {x: x*2 for x in range(3)}
print(result) # {0: 0, 1: 2, 2: 4}
result = {x: None for x in ['name', 'age', 'gender']}
print(result) # {'name': None, 'age': None, 'gender': None}
dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
result = {dog[x]: x for x in dog}
print(result)
dict(表达式 for 变量 in 序列)
表达式必须是有且只有唯一两个元素
dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'} result = dict((dog[x], x) for x in dog) print(result)
5、字典相关方法
1) 字典.clear()
清空字典
og = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
dog.clear()
print(dog) # {}
2) 字典.copy()
复制字典产生一个一模一样的新字典
dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'} dog1 = dog dog2 = dog.copy() print(dog1) # {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'} print(dog2) # {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'} dog.clear() print(dog, dog1, dog2) # {} {} {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
3) (了解)dict.fromkeys(序列)
创建一个字典,将序列中所有的元素作为字典key,默认值是none
result = dict.fromkeys('abcd') print(result) # {'a': None, 'b': None, 'c': None, 'd': None} result = dict.fromkeys(['name', 'age', 'gender'], 100) print(result) # {'name': 100, 'age': 100, 'gender': 100}
4) values、keys、items
字典.values()
获取字典中所有的值;返回的不是列表而是另一种序列
字典.keys()
获取字典中所有的键;返回的不是列表而是另一种序列
字典.items()
获取字典中键值对;返回的时候序列,序列中的元素是每个键值对对应的元组
dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'}
result = dog.values()
print(result) # dict_values(['财财', 3, '中华田园犬', '母狗'])
print(list(result)) # ['财财', 3, '中华田园犬', '母狗']
print(dog.keys()) # dict_keys(['name', 'age', 'breed', 'gender'])
print(dog.items()) # dict_items([('name', '财财'), ('age', 3), ('breed', '中华田园犬'), ('gender', '母狗')])
for x in dog.items():
print(x)
for x, y in dog.items():
print('x:', x, 'y', y)
5) 字典.setdefault(key, value)
在字典中添加键值队(不会在key存在的时候修改)
dog = {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗'} dog.setdefault('weight', 20) print(dog) # {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗', 'weight': 20}
如果key存在时不会修改也不增加
dog.setdefault('name', '小黑') print(dog) # {'name': '财财', 'age': 3, 'breed': '中华田园犬', 'gender': '母狗', 'weight': 20}
6) 字典.update(序列)
将序列中所有的元素作为键值对添加到字典中。序列必须是可以转换成字典的序列
字典1.update(字典2)
将字典2中的键值对全部添加到字典1中
dict1 = {'a': 10}
dict1.update({'b': 20, 'c': 30})
print(dict1) # {'a': 10, 'b': 20, 'c': 30}
二、集合
1、什么是集合
集合是容器型数据类型;将{}作为容器的标志,多个元素之间用逗号隔开{元素1, 元素2, 元素3, …}
集合是可变的;集合是无序的
元素:必须是不可变的数据;元素是唯一的
空集合:{}不是空集合,是空字典
set1 = set() print(type(set1), len(set1)) # <class 'set'> 0
集合是无序
print({1, 2, 3} == {2, 3, 1}) # True
集合的元素是不可变的类型的数据
set2 = {23, 'abc', (2, 3)} print(set2) # {(2, 3), 'abc', 23} # set2 = {23, 'abc', [2, 3]} # print(set2) # 报错!TypeError: unhashable type: 'list' 列表是可变的
集合的元素是唯一的
set4 = {10, 20, 30, 10, 20, 90, 20} print(set4) # {10, 20, 90, 30}
集合自带去重功能,但是只能去元素是不可变的序列的重复
names = ['张三', '李四', '王二', '李四', '张三', '张三'] print(set(names)) # {'张三', '李四', '王二'}
2、增删改查
1) 查
集合只能遍历(无法查单个和切片)
boll = {'乒乓球', '篮球', '羽毛球', '高尔夫', '网球'} for x in boll: print(x) # 无序取出集合中全部元素
2) 增
集合.add(元素) - 在集合中添加指定元素
boll.add('足球') print(boll) # {'篮球', '羽毛球', '足球', '乒乓球', '网球', '高尔夫'}
集合.update(序列) - 将序列中的元素全部添加在集合中
set5 = set() set5.update('abc') print(set5) # {'b', 'c', 'a'} set5.update({'name': '小左', 'age': '19'}) print(set5) # {'name', 'age', 'c', 'b', 'a'} 增加字典中的键
3) 删
集合.remove(元素) - 删除指定元素,如果元素不存在报错
oll = {'乒乓球', '篮球', '羽毛球', '高尔夫', '网球'} boll.remove('高尔夫') print(boll) # {'网球', '羽毛球', '篮球', '乒乓球'}
集合.discard(元素) - 删除指定元素,如果元素不存在不报错
boll.discard('网球') print(boll) # {'乒乓球', '篮球', '羽毛球'} # boll.remove('桌球') # 报错!KeyError: '桌球' boll.discard('桌球') # {'篮球', '乒乓球', '羽毛球'} 不报错
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) 并集:|
集合1 | 集合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}
集合2 - 集合1 - 获取在集合2中但是不在集合1中的所有的元素
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, 300} >= {1, 2}) # True
4、集合相关操作
1) in 和 not in
print((10 in {1, 10, 20})) # True
2) max、min、sorted、set、len
print(max({10, 97, 85})) # 97
print(sorted({10, 97, 85})) # [10, 85, 97]
print(sum({10, 97, 85})) # 192
print(len({10, 97, 85})) # 3
作业
1.用三个集合表示三门学科的选课学生姓名(一个学生可以同时选多门课)
set1 = {'小明', '小红', '小黄', '小蓝', '小绿'}
set2 = {'小明', '小蓝', '小绿', '小白', '小青', '小橙'}
set3 = {'小橙', '小天', '小门', '小明'}
a. 求选课学生总共有多少人
print(len(set1 | set2 | set3))
b. 求只选了第一个学科的人的数量和对应的名字
print('只选了第一科的人数:', len(set1 - set2 - set3), '姓名:', (set1 - set2 - set3))
c. 求只选了一门学科的学生的数量和对应的名字
a = (set1 ^ set2 ^ set3) - (set1 & set2 & set3)
print('只选一门课人数:', len(a), '姓名:', a)
d. 求只选了两门学科的学生的数量和对应的名字
s = (set1 | set2 | set3)
a = (set1 ^ set2 ^ set3) - (set1 & set2 & set3)
b = (set1 & set2 & set3)
c = s - a - b
print('只选两门课人数', len(c), '姓名:', c)
e. 求选了三门学生的学生的数量和对应的名字
print('选了三科的人数:', len(set1 & set2 & set3), '姓名:', (set1 & set2 & set3))