列表相关函数
max、min
-
max(序列) - 求序列最大值
-
min(序列) - 求序列最小值
-
例子
nums = [34, 89, 78] print(max(nums), min(nums)) # 89 34
sum
-
sum(数字序列) - 求数字序列中元素的和
-
例子
nums = [34, 89, 78] print(sum(nums)) # 201
sort与sorted
-
**sorted(序列) ** - 不修改原序列中元素的顺序而是产生一个新的排序列表;
-
列表.sort() - 直接对原数据进行排序,会修改原序列;
-
例子
# sorted nums = [34, 89, 78, 0, 8] new_nums = sorted(nums) print(nums) # [34, 89, 78, 0, 8] print(new_nums) # [0, 8, 34, 78, 89] # sort nums = [34, 89, 78, 0, 8] result = nums.sort() print(nums) # [0, 8, 34, 78, 89] print(result) # None
len
- len(序列) - 获取序列中元素的个数;
list
-
list(序列) - 所有的序列都可以转换成列表,所有的序列元素转换成列表元素;
-
例子
print(list('abc')) # ['a', 'b', 'c'] print(list(range(4))) # [0, 1, 2, 3] nums = [34, 89, 78, 0, 8] print(list(enumerate(nums))) # [(0, 0), (1, 8), (2, 34), (3, 78), (4, 89)]
列表推导式
语法
-
本质就是创建列表的表达式(简洁)
-
结构一:[表达式 for 变量 in 序列]
-
结构二:[表达式 for 变量 in 序列 if 条件语句]
-
例子
list1 = [10 for x in range(4)] print(list1) # [10, 10, 10, 10] list2 = [x for x in range(4)] print(list2) # [0, 1, 2, 3] list3 = [x * 2 + 1 for x in range(4)] print(list3) # [1, 3, 5, 7] scores = [89, 67, 43, 56, 10, 90] list4 = [x % 10 for x in scores] print(list4) # [9, 7, 3, 6, 0, 0] list5 = [x >= 60 for x in scores] print(list5) # [True, True, False, False, False, True] list6 = [x for x in scores if x >= 60] print(list6) # [89, 67, 90] list7 = [10 for x in range(4) if x % 2] print(list7) # [10, 10]
拓展 - 三目运算符
- 单目运算符:not
- 双目运算符:两个数字参与运算的运算符
- 三目运算符:if-else
C/Java语言的三目运算符
-
如果条件语句成立,整个运算结果是表达式1的值,否则运算结果是表达式2的值
条件语句?表达式1:表达式2
Python的三目运算符
表达式1 if 条件语句 else 表达式2
-
例子
age = 17a = '成年' if age >= 18 else '未成年'print(a)
应用
-
让序列中的元素进行统一变换;
-
[表达式 for 变量 in 序列]
-
-
将序列中的元素满足某个条件的元素进行变换(根据某个条件是否满足做两种不同的变换[三目运算])
-
[表达式1 if 条件语句 else 表达式2 for 变量 in 序列]
-
-
提取或者删除序列中满足某个条件的元素
-
[表达式 for 变量 in 序列 if 条件语句]
-
-
例子
nums = [89, 67, 34, 56, 10, 90] nums1 = [[index, item] for index, item in enumerate(nums)] print(nums1) # [[0, 89], [1, 67], [2, 34], [3, 56], [4, 10], [5, 90]] # 练习1:将nums中所有的偶数除以2 # [89, 67, 34, 56, 10, 90, 35] -> [89, 67, 17, 28, 5, 45, 35] nums = [89, 67, 34, 56, 10, 90, 35] nums1 = [item // 2 if not item % 2 else item for item in nums] print(nums1) # [89, 67, 17, 28, 5, 45, 35] # 练习2:删除所有的偶数(提取所有的奇数) nums = [89, 67, 34, 56, 10, 90, 35] nums1 = [item for item in nums if item % 2] print(nums1) # [89, 67, 35]
元组
- 元组是容器型数据类型;
- 将()作为容器的标志,里面多个元素用逗号隔开;
- 表示方式:(元素1,元素2,元素3,…,元素N)
- 元组不可变(只能查询);空元组存在,但是不可用;
- 元组是有序的,支持下标操作;
- 元素:什么样的数据都可以作为元组的元素
空元组
t1 = ()
print(type(t1), len(t1))
只有一个元素的元组
- 唯一的元素后面必须加逗号;
list1 = [12]
print(list1, type(list1), len(list1)) # [12] <class 'list'> 1
t2 = (12) # 不加逗号括号表示将元素括起来,而不是表示为元组
print(t2, type(t2)) # 12 <class 'int'>
t3 = (12,)
print(t3, type(t3)) # (12,) <class 'tuple'>
普通情况
t4 = (10, 'df', True)
print(t4) # (10, 'df', True)
-
在没有歧义的情况下,元组的小括号可以省略(直接将多个数据用逗号隔开表示的也是一个元组);
t5 = 10, 34, 78 print(t5, type(t5)) # (10, 34, 78) <class 'tuple'> t6 = 10, 34, 78 * 2 print(t6, type(t6)) # (10, 34, 156) <class 'tuple'>
元组的查询
- 获取元组元素
列表获取元素的方式
- 列表获取元素的方式元组都支持;
通过变量直接获取元组的元素
命名元组
-
变量的个数和元组中元素的个数保持一致;
point = (10, 23, 12) x, y, z = point print(x, y, z) # 10 23 12
可变参数
-
变量的个数小于元素的个数时,那么必须在其中一个变量前加星号;
-
取得时候先让没有变量按照位置关系获取元素,剩下的全部给带变量(以列表的形式);
info = ('张三', 18, 175, 180, 90, 67, 89) name, age, *other = info print(name, age, other) # 张三 18 [175, 180, 90, 67, 89] name, *other = info print(name, other) # 张三 [18, 175, 180, 90, 67, 89] name, age, *other, math = info print(name, age, other, math) # 张三 18 [175, 180, 90, 67] 89
元组不可变
- 列表中不可变相关操作元组都支持;
字典
作用
-
同时保存多个意义不同的数据;
stu = { 'name': '小明', 'age': 20, 'gender': '男', '体重': 60, '数学': 89, '语文': 70, '英语': 55 } print(stu['name'])
定义
- 字典是容器型数据类型;
- 将{}作为容器标志,里面有多个键值对用逗号隔开:{key1:value1,key2:value2,…,keyN:valueN,}
- 字典是可变的(支持增删改);
- 字典是无序的(不支持下标访问);
-
元素的要求:字典元素是键值对;
- 键 - 必须是不可变的唯一的数据(数字,字符串,元组);
- 值 - 没有要求;
空字典{}
d1 = {}
print(type(d1), len(d1), bool(d1)) # <class 'dict'> 0 False
键是不可变数据
d2 = {1: 10, 'a': 20, (10, 20): 30} # {1: 10, 'a': 20, (10, 20): 30}
print(d2)
# d3 = {1: 10, 'a': 20, [10, 20]: 30} # TypeError: unhashable type: 'list'
键是唯一的
d4 = {1: 10, 'a': 20, (10, 20): 30, 'a': 30} # 如果有重复键那么只会保存一个键的值
print(d4) # {1: 10, 'a': 30, (10, 20): 30}
字典是无序的
print({'a': 10, 'b': 20} == {'b': 20, 'a': 10}) # True
print([('a', 10), ('b', 20)] == [('b', 20), ('a', 10)]) # False
字典的增删改查
字典的查询
- 获取字典的值
获取单个值
-
字典[键] - 获取字典中指定键对应的值,如果键不存在程序报错
-
字典.get(键)| 字典.get(键,默认值) - 获取字典中指定键对应的值,如果键不存在返回None或者返回默认值
dog = {'name': '黑猪', 'age': 3, 'breed': '土狗', 'gender': '母狗', 'color': '黑色'} print(dog['name'], dog['gender']) # 黑猪 母狗 print(dog.get('name')) # 黑猪 print(dog.get('height', 0)) # 0
字典的遍历
-
通过for循环遍历字典的时候,循环变量依次取值为字典的键;
-
for 键 in 字典: 循环
-
例子
dog = {'name': '黑猪', 'age': 3, 'breed': '土狗', 'gender': '母狗', 'color': '黑色'} for key in dog: print(key, dog[key]) for k, v in dog.items(): print(k, v) for i in dog.values(): print(i)
实际应用中的字典和列表
定义一个保存一个班级信息
class1 = {
'name': 'python2104',
'address': '23教',
'lecturer': {'name': '余婷', 'age': 18, 'QQ': '726550822'},
'leader': {'name': '舒玲', 'age': 18, 'QQ': '2343844', 'tel': '110'},
'students': [
{'name': 'stu1', 'school': '清华大学', 'tel': '1123', 'linkman': {'name': '张三', 'tel': '923'}},
{'name': 'stu2', 'school': '攀枝花学院', 'tel': '8999', 'linkman': {'name': '李四', 'tel': '902'}},
{'name': 'stu3', 'school': '成都理工大学', 'tel': '678', 'linkman': {'name': '小明', 'tel': '1123'}},
{'name': 'stu4', 'school': '四川大学', 'tel': '9900', 'linkman': {'name': '小花', 'tel': '782'}},
{'name': 'stu5', 'school': '西南交大', 'tel': '665', 'linkman': {'name': '老王', 'tel': '009'}}
]}
-
获取班级名称
class_name = class1['name'] print(class_name)
-
获取讲师QQ
lecturer_QQ = class1['lecturer']['QQ'] print(lecturer_QQ)
-
获取所有学生的名字和学校
for stu in class1['students']: print(stu['name'], stu['school'])
-
获取所有学生的联系人的电话
for stu in class1['students']: print(stu['linkman']['tel'])
课后作业
1.创建一个列表,列表中有10个数字, 保证列表中元素的顺序,对列表进行排重,并对列表使用进行降序排序
例如:随机生成了[70, 88, 91, 70, 107, 234, 91, 177, 282, 197]
--- 去重之后 [70, 88, 91, 107, 234, 177, 282, 197]
---- 降序排序 [282, 234, 197, 177, 107, 91, 88, 70]
nums = [70, 88, 91, 70, 107, 234, 91, 177, 282, 197]
new_nums = []
for index1 in nums:
if not new_nums.count(index1) :
new_nums.append(index1)
new_nums.sort(reverse=True)
print(new_nums)
# [282, 234, 197, 177, 107, 91, 88, 70]
2.利用列表推导式, 完成以下需求
a. 生成一个存放1-100中各位数为3的数据列表
结果为 [3, 13, 23, 33, 43, 53, 63, 73, 83, 93]
print([num for num in range(3,100) if num % 10 == 3])
b. 利用列表推到是将 列表中的整数提取出来
例如:[True, 17, "hello", "bye", 98, 34, 21] --- [17, 98, 34, 21]
eg = [True, 17, "hello", "bye", 98, 34, 21]
b = [item for item in eg if type(item) == int]
print(b)
c.利用列表推导式 存放指定列表中字符串的长度
例如 ["good", "nice", "see you", "bye"] --- [4, 4, 7, 3]
str1 = ["good", "nice", "see you", "bye"]
c = [len(item) for item in str1]
print(c)
4.已经一个班级字典如下:
class1 = { 'name': 'python2104', 'address': '23教', 'lecturer': {'name': '余婷', 'age': 18, 'QQ': '726550822'}, 'leader': {'name': '舒玲', 'age': 18, 'QQ': '2343844', 'tel': '110'}, 'students': [ {'name': 'stu1', 'school': '清华大学', 'tel': '1123', 'age': 18, 'score': 98, 'linkman': {'name': '张三', 'tel': '923'}}, {'name': 'stu2', 'school': '攀枝花学院', 'tel': '8999', 'age': 28, 'score': 76, 'linkman': {'name': '李四', 'tel': '902'}}, {'name': 'stu3', 'school': '成都理工大学', 'tel': '678', 'age': 20, 'score': 53, 'linkman': {'name': '小明', 'tel': '1123'}}, {'name': 'stu4', 'school': '四川大学', 'tel': '9900', 'age': 30, 'score': 87, 'linkman': {'name': '小花', 'tel': '782'}}, {'name': 'stu5', 'school': '西南交大', 'tel': '665', 'age': 22, 'score': 71, 'linkman': {'name': '老王', 'tel': '009'}}, {'name': 'stu6', 'school': '成都理工大学', 'tel': '892', 'age': 32, 'score': 80, 'linkman': {'name': '老王2', 'tel': '0091'}}, {'name': 'stu7', 'school': '四川大学', 'tel': '431', 'age': 17, 'score': 65, 'linkman': {'name': '老王3', 'tel': '0092'}}, {'name': 'stu8', 'school': '攀枝花学院', 'tel': '2333', 'age': 16, 'score': 32, 'linkman': {'name': '老王4', 'tel': '0093'}}, {'name': 'stu9', 'school': '攀枝花学院', 'tel': '565', 'age': 21, 'score': 71, 'linkman': {'name': '老王5', 'tel': '0094'}} ]}
1)获取班级位置
print(class1['address'])
2)获取班主任的名字和电话
print(class1['leader']['name'], class1['leader']['tel'])
3)获取所有学生的姓名和分数
print([(stu['name'], stu['score']) for stu in class1['students']])
4)获取所有学生联系人的名字和电话
print([(stu['linkman']['name'], stu['linkman']['tel']) for stu in class1['students']])
5)获取班级最高分
print('最高分为:', max([stu['score'] for stu in class1['students']]))
# 最高分为: 98
6)获取班级分数最高的学生的姓名
print('分数最高的学生姓名为:', [stu['name'] for stu in class1['students']
if stu['score'] == max([stu['score'] for stu in class1['students']])])
# 分数最高的学生姓名为: ['stu1']
7)计算班级学生的平均分
print('平均分为:', sum([stu['score'] for stu in class1['students']]) / len(class1['students']))
# 平均分为: 70.33333333333333
8)统计班级中未成年人数
print('未成年人数为:', len([stu['name'] for stu in class1['students'] if stu['age'] < 18]))
# 未成年人数为: 2
9)用字典统计每个学校的人数, 类似: {'清华大学': 1, '攀枝花学院': 3}
# 方法1:
nums = {}
for stu in class1['students']:
if stu['school'] not in nums:
nums[stu['school']] = nums.get(stu['school'], 1)
# nums.setdefault(stu['school'], 1) # 方法2
else:
nums[stu['school']] += 1
print(nums)
# 改进:
nums = {}
for stu in class1['students']:
nums[stu['school']] = nums.get(stu['school'], 0) + 1
# nums[stu['school']] = nums.setdefault(stu['school'], 0) + 1
print(nums)
# {'清华大学': 1, '攀枝花学院': 3, '成都理工大学': 2, '四川大学': 2, '西南交大': 1}