一、字典:dict
里面的元素是一个键值对: key-valuekey有3个特点:a.唯一
b.不可变类型
c.无序(没有下标)
1.创建字典:
# 创建空字典d1 = {}# 创建非空字典# 方式一:d2 = {"name": "坤", "age": 22, "height": 184}print(d2)#运行结果: {"name": "坤", "age": 22, "height": 184}'''...................................................'''#方式二#dict(key=value),key是一个变量名,value是一个值dict22 = dict(a="avvv",b="2353")print(dict22)dict22 = dict(a=200,b=33)print(dict22)#运行结果:# {'a': 'avvv', 'b': '2353'}# {'a': 200, 'b': 33}'''...................................................'''#方式三:#dict()和zip(序列),zip表示映射#dict(zip([key1,key2,key3....],[value1,value2,value3....]))#注意:key的数量和value的数量可以不一致,以少的作为参考z1 = zip([1,2],["a","b","c"])dict23 = dict(z1)print(dict23)#运行结果:# {1: 'a', 2: 'b'}
2.字典查询:
d = {"name": "坤", "age": 22, "height": 184}print(d['name']) # 方式一print(d.get('name')) # 方式二key = "name" # 给key赋值查询print(d[key])print(d.get(key))# print(d['sex']) # 报错,没有key则报错print(d.get('sex')) # 没有key不报错,但是返回Noneprint(d.get('sex', "男")) # 没有key不报错,返回默认值
3.遍历字典:
d = {"name": "蔡徐坤", "age": 22, "height": 184}for k in d:print(k) # key# for k in d.keys():#print(k) # keyfor v in d.values():print(v) # valuefor k, v in d.items():print(k, v) # key valuek = d.keys()print(k, list(k))# dict_keys(['name', 'age', 'height']) ['name', 'age', 'height']
4.字典合并:
d1 = {1: 2}d2 = {3: 4}d1.update(d2)# print({1:2} + {3:4}) # 错误 不可以用字典+字典的方式进行合并print(d1) # {1: 2, 3: 4}
5.字典的增、删、改、查:
# 增d['sex'] = "男"print(d) # {'name': '蔡徐坤', 'age': 22, 'height': 184, 'sex': '男'}# 改d['age'] = 30print(d) # {'name': '蔡徐坤', 'age': 30, 'height': 184, 'sex': '男'}# 删d.pop('age') # 删除指定key的元素# d.clear() # 清空字典# d.popitem() # 删除最后一项,可以认为是随机删除一项, 了解# del d['age']print(d)# 查即为遍历
6.列表与字典之间的区别:
list:
1. 定义方式: [], 一般存放相同类型的数据
2. 内存相对字典较小
3. 数据量较大时, 查找所需时间越久
dict:
1. 定义方式: {}, 一般存放同一个事物的不同属性
2. 内存消耗较大
3. 数据量不管多少, 对查询速度影响不大
二、元组:tuple
元组本质上是一个不可以改变的列表
1. 元组的基本功能:
1)创建元组:
t = () # 空元组t = (1,) # 包含1个元素的元组t = (1, 2, 3, "hello", True)print(t, type(t))
2)元组的合并:
print((1,2) + (3,4)) # (1, 2, 3, 4)
3)元组的重复:
print((1,2,3) * 3) # (1, 2, 3, 1, 2, 3, 1, 2, 3)
4)元组的切片:
t = (1,2,3,4,5,6)print(t[2:5])print(t[::-1])
5)元组的遍历:
t = (11, 22, 33)for n in t:print(n) # 元素for i in range(len(t)):print(i) # 下标for i,n in enumerate(t):print(i, n)
2.元组的其他功能:
1)元组的增、删、改、查:
元组与数列不同,无法对元组中的元素进行修改!
t = (11, 22, 33)# t[0] = 9 # 报错, 不能修改
2)元组排序:
t = (3, 2, 7, 1, 9)t2 = sorted(t) # 升序t2 = sorted(t, reverse=True) # 降序print(t2)t = (3, 2, 7, 1, 9)t2 = reversed(t)print(list(t2))
3)列表和元组的转换
print(list( (1,2,3) )) # [1, 2, 3]print(tuple( [1,2,3] )) # (1, 2, 3)
4)元组列表快速取值
x, y = (2, 3)x, y = [2, 3]print(x, y)
三、集合:set
集合的特点:
无序唯一: 不能重复
1.创建集合:
s = {1, 2, 2, 2, 3, 4}print(s) # {1, 2, 3, 4}s = set()print(s) # set() 空集合
2.列表去重:
l = [1, 2, 4, 4, 4, 3, 3, 2, 2, 1, 6, 7, 6]l2 = list(set(l))print(l2) # [1, 2, 3, 4, 6, 7]
3.集合的遍历:
s = {11, 22, 33}for n in s:print(n)
4.集合的增、删:
# 增s.add(44)s.update([55, 66])print(s)# {33, 66, 11, 44, 22, 55}# 删s.remove(33)# s.discard(333)s.clear()print(s)
5.集合的运算:
s1 = {1, 2, 3, 4}s2 = {3, 4, 5, 6}print(s1 & s2) # 交集; {3, 4}print(s1 | s2) # 并集; {1, 2, 3, 4, 5, 6}print(s1 - s2) # 差集; {1, 2}print(s1 ^ s2) # 对称差集; {1, 2, 5, 6}print(s1 > s2) # s1包含s2; Falseprint(s1 < s2) # s2包含s1; False
四、排序算法(冒泡排序 & 选择排序)
1.冒泡排序:
原理:
[9,7,6,8,5,4,3,2,1]
第1次(i=0, j=9-i-1) [9,7,6,8,5,4,3,2,1] => [7,6,8,5,4,3,2,1, 9]第2次(i=1, j=9-i-1) [7,6,8,5,4,3,2,1, 9] => [6,7,5,4,3,2,1, 8,9]第3次(i=2, j=9-i-1) [6,7,5,4,3,2,1, 8,9] => [6,5,4,3,2,1, 7,8,9]第4次(i=3, j=9-i-1) [6,5,4,3,2,1, 7,8,9] => [5,4,3,2,1, 6,7,8,9]第5次(i=4, j=9-i-1) [5,4,3,2,1, 6,7,8,9] => [4,3,2,1, 5,6,7,8,9]第6次(i=5, j=9-i-1) [4,3,2,1, 5,6,7,8,9] => [3,2,1, 4,5,6,7,8,9]第7次(i=6, j=9-i-1) [3,2,1, 4,5,6,7,8,9] => [2,1, 3,4,5,6,7,8,9]第8次(i=7, j=9-i-1) [2,1, 3,4,5,6,7,8,9] => [1, 2,3,4,5,6,7,8,9]
nums = [9,7,6,8,5,4,3,2,1]for i in range(len(nums)-1): # i=0,1,2,3,4,5,6,7for j in range(len(nums)-1-i):if nums[j] > nums[j+1]:nums[j], nums[j+1] = nums[j+1], nums[j]print(nums)
2.选择排序:
原理:
[9,7,6,8,5,4,3,2,1]
第1次(i=0) [9,7,6,8,5,4,3,2,1] => [1, 7,6,8,5,4,3,2,9]第2次(i=1) [1, 7,6,8,5,4,3,2,9] => [1,2, 6,8,5,4,3,7,9]第3次(i=2) [1,2, 6,8,5,4,3,7,9] => [1,2,3, 8,5,4,6,7,9]第4次(i=3) [1,2,3, 8,5,4,6,7,9] => [1,2,3,4, 5,8,6,7,9]第5次(i=4) [1,2,3,4, 5,8,6,7,9] => [1,2,3,4,5, 8,6,7,9]第6次(i=5) [1,2,3,4,5, 8,6,7,9] => [1,2,3,4,5,6, 8,7,9]第7次(i=6) [1,2,3,4,5,6, 8,7,9] => [1,2,3,4,5,6,7, 8,9]第8次(i=7) [1,2,3,4,5,6,7, 8,9] => [1,2,3,4,5,6,7,8, 9]
nums = [9,7,6,8,5,4,3,2,1]for i in range(len(nums)-1): # i=0,1,2,3,4,5,6,7# 求剩下数中最小数的下标min_index = ifor j in range(i, len(nums)):if nums[j] < nums[min_index]:min_index = j# 用最小数和第i个元素交换nums[i], nums[min_index] = nums[min_index], nums[i]print(nums)
五、习题
声明一个字典保存一个学生的信息,学生信息中包括:姓名、年龄、成绩(单科)、电话、性别(男、女、不明)声明一个列表,在列表中保存6个学生的信息(6个(题1)中的字典)
(1) 统计不及格学生的个数
(2) 打印不及格学生的名字和对应的成绩
(3) 统计未成年学生的个数
(4) 打印手机尾号是8的学生的名字
(5)删除性别不明的所有学生(选做)
上期习题答案:
1.给定一个列表:将列表中指定的某个元素全部删除
ages = [2, 6, 3, 10, 7, 8, 9, 2]for i in range(0, ages.count(2)):ages.remove(2)print(ages)
2.自定义一个列表,最大的与第一个元素交换,最小的与最后一个元素交换,输出列表
ages = [2, 6, 3, 1, 7, 8, 23, 2]b = 0# 取得最大列表中最大元素值的下标c = ages.index(max(ages))# 取得最小列表中最大元素值的下标d = ages.index(min(ages))print(ages)# 将列表第一个元素存在b中b = ages[0]# 将最大元素的值赋给第一个元素ages[0] = ages[c]# 将b中存储的元素值赋给最大元素ages[c] = b# 将列表最后一个个元素存在b中b = ages[len(ages)-1]# 将最小元素的值赋给最后一个元素ages[len(ages)-1] = ages[d]# 将b中存储的元素值赋给最小元素ages[d] = bprint(ages)
3.对称列表. 传入一个列表,元素类型与个数皆未知,返回新列表,由原列表的元素正序反序拼接而成
如传入[“One”, “Two” ,”Three”] 返回[“One”, “Two”, “Three” ,”Three” ,”Two”, “One”]
# 方法一(切片法):b = list(map(str, input('请输入列表:').split()))c = b[::-1]print(b + c)# 方法二(reverse逆置法):b = list(map(str, input('请输入列表:').split()))c = b.copy()c.reverse()print(b + c)
4.列表去重, 将下面的列表中重复的元素去除[1,1,1,3,4 ]
# 方法一:list1 = [1,1,1,3,4 ]list2 = []n = len(list1)for i in range(n):if list1[i] not in list2:list2.append(list1[i])list1 = list2print(list1)#方法二:list1 = [1,1,1,3,4 ]list1 = list(set(list1))print(list1)