第二周 Day 3 —— 容器
一、列表相关操作
1. 列表推导式
-
序列变幻成列表
nums = [10, 245, 89, 45] list2 = [x*100 for x in nums] print(list2) # [1000, 24500, 8900, 4500]
-
筛选(提取出有效的或者删除无效的)
scores = [100, 84, 45, 89, 99, 78, 65, 12, 92, 77, 32] new_scores = [x for x in scores if x >= 60] print(new_scores) # [100, 84, 89, 99, 78, 65, 92, 77]
-
不统一的变幻
list1 = [19, 'abc', 98, 'mnb', 13, 53] # ->[190, 'abc', 980, 'mnb', 130, 530] new_list1 = [x*10 if type(x) == int else x for x in list1 ] #三目运算 print(new_list1) # [190, 'abc', 980, 'mnb', 130, 530]
2. 列表的加法和乘法
-
加法
列表1 + 列表2 —— 合并两个列表产生一个新的列表
a = [1, 2, 3] b = ['亚索','卡特琳娜'] result = a + b print(result) # [1, 2, 3, '亚索', '卡特琳娜']
-
乘法
列表 * N —— 列表中的元素重复N次产生一个新的列表
a = [1, 2, 3] print(a * 3) # [1, 2, 3, 1, 2, 3, 1, 2, 3]
3. 比较运算
-
比较相等:
==
、!=
a. 两个列表相等,列表元素的类型、值、个数、顺序要一样
print([1, 2, 3] == [1, 2, 3]) # True print([1, 2, 3] == [1, 3, 2]) # False
b. 两个不同类型的数据可以判断是否相等,只是结果一定是
False
print([1, 2] == ['abc']) # False print([1, 2] == '[1, 2]') # False
c.
is
的用法print(2 is 2) # True print('you' is 'you') # True print([1, 2] is [1, 2]) # False
is
的实质是判断两个数据在内存中的地址是否相同id(变量) — 获取变量中保存的数据在内容空间中的地址
结论1:用数据给变量赋值的时候,如果数据是不可变,那么会复用前面存储的值。
如果数据可变,不管之前有没有存储过,都会重新开辟新的内容空间。
# 数据可变 a = 100 b = 100 print(id(a), id(b)) # 1910297360 1910297360 # 列表不可变 a = [10, 20] b = [10, 20] print(id(a), id(b)) # 1460367337352 1460367336584 # 元组不可变 a = (10, 20) b = (10, 20) print(id(a), id(b)) # 2306786481992 2306786482056 # 字典可变 a = {'a': 10} b = {'a': 10} print(id(a), id(b)) # 1460165434968 1460165435040
结论2:如果一个变量给另外一个变量赋值,其实是让新的变量保存原变量中的数据的地址。(不会开辟新的空间保存数据)
a = 100 b = a print(id(a), id(b)) # 1910297360 1910297360 a = [10, 20] b = a print(id(a), id(b)) # 1927609264008 1927609264008
结论3:python中所有的变量都是指针变量。(变量保存数据的时候其实保存的是数据在内存中存储的地址)
二、列表相关函数和方法
1.相关函数:max
、min
、sum
、sorted
、len
、list
-
max
和min
- max(序列) — 返回序列中元素的最大值
- min(序列) — 返回序列中元素的最小值
nums = [90, 80, 46, 78, 100] print(max(nums)) # 100 print(min(nums)) # 46
序列中元素数据类型必须是一样的。
-
sum
- sum(序列) — 求序列中所有元素的和(序列中的元素只能是数字)
nums = [90, 80, 46, 78, 100] print(sum(nums)) # 394 print(sum(range(101))) # 5050
-
sorted
- sorted(序列) — 将序列中的元素从小到大排序(升序),以列表的形式返回
- sorted(序列, reverse=True) — 将序列中的元素从大到小排序(降序),以列表的形式返回
nums = [90, 80, 46, 78, 100] new_nums1 = sorted(nums) # 不会影响原列表 print(new_nums1) # [46, 78, 80, 90, 100] new_nums2 = sorted(nums, reverse=True) print(new_nums2) # [100, 90, 80, 78, 46]
-
list
- list(序列) — 将其他序列转换成列表(任何序列都可以转换成列表)
list1 = list('abc') print(list1) # ['a', 'b', 'c'] list2 = list(range(10, 15)) print(list2) # [10, 11, 12, 13, 14]
2. 相关方法 — 列表.xxx()
-
列表.clear() — 删除列表中所有的元素
song = ['关山酒', '将故事写成我们'] song.clear() print(song) # []
-
列表.copy() — 返回一个和原列表一样(长得一样)的新的列表
song = ['关山酒', '将故事写成我们'] song2 = song.copy() print(song2) # ['关山酒', '将故事写成我们']
列表[:]、列表+[]、列表*1 — 都可以返回一个新的长得一样的列表
-
列表.count(元素) — 返回元素在列表中出现的次数
nums = [90, 80, 46, 78, 100, 80, 76, 80, 90, 80] print(nums.count(80)) # 4
-
列表.extend(序列) — 将序列中的元素去全部添加到列表中
song = ['关山酒', '将故事写成我们'] song.extend(['告白气球', '生生']) print(song) # ['关山酒', '将故事写成我们', '告白气球', '生生']
-
列表.index(元素) — 返回元素在列表中的下标(从0开始的下标值)
song = ['关山酒', '将故事写成我们', '告白气球', '生生', '将故事写成我们'] print(song.index('将故事写成我们')) # 1 # print(song.index('七里香')) # 报错
如果元素在列表中有多个,则返回的是第一次出现的元素的下标。
如果元素不存在列表中,则报错。
-
列表.reverse() — 列表逆序
song = ['关山酒', '将故事写成我们', '告白气球', '生生', '将故事写成我们'] song.reverse() # new_song = song[::-1]也可实现逆序 print(song) # ['将故事写成我们', '生生', '告白气球', '将故事写成我们', '关山酒']
-
列表.sort() — 将原列表排序(升序)
列表.sort(reverse=True) — 降序
nums = [90, 80, 46, 78, 100] nums.sort() print(nums) # [46, 78, 80, 90, 100]
二、字典
1.什么是字典 —— dict
- 字典是容器型数据类型,将
{}
作为容器的标志,里面多个元素(元素都是键值对)用逗号隔开。
{键1:值1,键2:值2,键3:值3,…}
注意:字典保存数据,其实是想要保存的是值,键的作业是对值进行区分和说明的。
dict1 = {} # 空字典
print(dict1, type(dict1)) # {} <class 'dict'>
-
字典可变(支持增删改);字典是无序的(不支持下标操作)
-
字典的元素 —— 必须值键值对
- 键 — 必须是不可变的数据(一般使用字符串)、唯一的
- 值 — 任何类型的数据都行,可以重复
dict1 = {10: 100, 125: 200, 'name': '张三', True: 300} print(dict1) # {10: 100, 125: 200, 'name': '张三', True: 300} # dict2 = {[10,20]: 100} # 报错,列表是可变的数据,不能作为键 dict3 = {10: 100, 20: 200, 10: 300} print(dict3) # {10: 300, 20: 200} 键是唯一的
练习:定义一个变量保存一条狗的信息
dog = {
'name': '赛亚人',
'age': 5,
'sex': '公狗',
'weight': 15,
'variety': 'Chinese Country Dog',
'master': 'Maple'
}
三、字典的增删改查
1. 查 —— 获取字典的值
-
获取单个值
- 字典[key] — 获取字典中指定
key
对应的值,如果key
不存在会报错 - 字典.get(key) — 获取字典中指定
key
对应的值,如果key
不存在,不会报错并返回None
- 字典.get(key, 默认值) — 获取字典中指定
key
对应的值,当key
不存在时返回默认值
film = {'name': '肖生克的救赎', 'director': '弗兰克·德拉邦特', 'time': '1994'} print(film['name']) # '肖生克的救赎' print(film['time']) # '1994' print(film['age']) # 报错 print(film.get('name')) # '肖生克的救赎' print(film.get('time')) # '1994' print(film.get('age')) # None print(film.get('age', '不存在age')) # 不存在age
- 字典[key] — 获取字典中指定
-
遍历
- for - in — 遍历字典,变量取到的是字典的键
film = {'name': '肖生克的救赎', 'director': '弗兰克·德拉邦特', 'time': '1994'} for x in film: print(x,film[x]) #name 肖生克的救赎 #director 弗兰克·德拉邦特 #time 1994
练习:定义一个变量保存一个班所有的学生信息,每个学生中包含姓名、年龄、性别、电话号码
# 1)计算这个这个班的学生的平均年龄
# 2)统计班级中女生的个数# 方法一 students = [ {'name': 'stu1', 'age': 18, 'gender': '男', 'tel': '1101'}, {'name': 'stu2', 'age': 22, 'gender': '女', 'tel': '1104'}, {'name': 'stu3', 'age': 30, 'gender': '女', 'tel': '1102'}, {'name': 'stu4', 'age': 23, 'gender': '男', 'tel': '1106'}, {'name': 'stu5', 'age': 24, 'gender': '男', 'tel': '1109'}, {'name': 'stu6', 'age': 16, 'gender': '女', 'tel': '1100'} ] ages = 0 girl_num = 0 for stu in students: ages += stu['age'] if stu['gender'] == '女': girl_num += 1 print(f'平均年龄:{ages // len(students)}') # 平均年龄:22 print(f'女生的个数:{girl_num}') # 女生的个数:3 # 方法二(了解) avr_ages = sum([x['age'] for x in students]) // len(students) print(f'平均年龄:{avr_ages}') # 平均年龄:22 result = [x['gender'] for x in students].count('女') print(f'女生的个数:{result}') # 女生的个数:3
2. 增、改
字典[key] = 值 — 当
key
存在的时候就是修改,当key
不存在的时候就是增加
computer = {'price': 5432, 'brand': '联想'}
print(computer) # {'price': 5432, 'brand': '联想'}
computer['color'] = '白色'
print(computer) # {'price': 5432, 'brand': '联想', 'color': '白色'}
computer['price'] = 3000
print(computer) # {'price': 3000, 'brand': '联想', 'color': '白色'}
3. 删
-
del 字典[key] — 删除字典中指定
key
对应的键值对。(key
不存在,报错)computer = {'price': 3000, 'brand': '联想', 'color': '白色'} del computer['price'] print(computer) # {'brand': '联想', 'color': '白色'}
-
字典.pop(key) — 取出字典中指定
key
对应的值。computer = {'price': 3000, 'brand': '联想', 'color': '白色'} price = computer.pop('price') print(computer, price) # {'brand': '联想', 'color': '白色'} 3000
四、字典相关操作及方法
1. in
和not in
操作
字典的in
和not in
判断的是某刻key
是否存在
dict1 = {'a': 10, 'b': 20, 'c': 30}
print(10 in dict1) # False
print('a' in dict1) # True
2. max
、min
、sum
、sorted
(了解)——这些操作全部针对字典的key
dict1 = {'a': 10, 'b': 20, 'c': 30}
print(max(dict1)) # c
3. dict
dict(序列) — 将序列转换成字典。
序列的要求:a. 序列中的每个元素都是序列
b. 小序列有且只有两个元素
c. 小序列的第一个元素不可变
seq = ['ab', '12', 'c1']
print(dict(seq)) # {'a': 'b', '1': '2', 'c': '1'}
seq = [range(2), ['name', 'age']]
print(dict(seq)) # {0: 1, 'name': 'age'}
4. 字典转列表(所有序列都可以转换成列表)
将字典所有的键作为列表元素
dict1 = {'a': 10, 'b': 20, 'c': 30}
print(list(dict1)) # ['a', 'b', 'c']
b. 小序列有且只有两个元素
c. 小序列的第一个元素不可变
seq = ['ab', '12', 'c1']
print(dict(seq)) # {'a': 'b', '1': '2', 'c': '1'}
seq = [range(2), ['name', 'age']]
print(dict(seq)) # {0: 1, 'name': 'age'}
4. 字典转列表(所有序列都可以转换成列表)
将字典所有的键作为列表元素
dict1 = {'a': 10, 'b': 20, 'c': 30}
print(list(dict1)) # ['a', 'b', 'c']