2-Data structure
数据结构是能够将数据组合在一起的结构
数据结构可以大大简化我们的程序
python中的常用的数据结构有:
- 列表List:有序项集合的变量,例:a=[1,2,3,4]
- 元组Tuple:有序项的集合变量,无法修改,例:b=[Monday,Tuesday,Wednesdays,Thursdays,Friday,Saturdays,Sunday]
- 字典 Dict:无序(键,值)项的集合的变量,以花括号标识,:c={“XiaoHu”:“1998”,“XiaoMing”:“1997”,“XiaoWei”:“2000”}
- 集合 Set:无序项的元素集合,没有顺序和出现次数,例:municipalities={“Beijing”,“Shanghai”,“Tianjin”,“Chongqing”}
程序=数据结构+算法
2.1列表
列表用于保存有序项的集合的变量,通过 [] 创建
创建一个含有四个整数的列表
a=[1,2,3,4]
列表支持下列操作:
- 增:通过函数 append可以向列表增加元素
- 删:通过关键字del可以删除列表内元素
- 查:通过关键字
[ ]
可以查找列表某个位置元素 - 改:通过赋值符号 = 可以修改某个元素
列表的优点是:
- 快速向尾部添加元素
- 快速遍历所有元素
- 节省占用计算机内容空间
2.1.1查找元素
通过 [ ]关键字查找列表某个位置的元素
例如:a[0]可以获取列表中某个元素,a[1]可以获取列表中的第二个元素。还可以倒序查找a[-1] 表示倒数第一个元素(末尾的元素)
## 查找 第一个元素
print(a[0])
## 查找 第二个元素
print(a[1])
## 查找 倒数 第二个元素
print(a[-1])
## 查找 倒数 第一个元素
print(a[-2])
1
2
4
3
[ ]关键字也可以通过“切片”的形式获取含有多个元素的子列表
## 查找第 0 到第 3 的元素子列表
## 里面的切片获取的 [0:3] 第0个元素,第一个元素,第二元素的
print(a[0:3])
## 左闭右开
## 查找第 1 到倒数 第一个元素
print(a[1:-1])
[1, 2, 3]
[2, 3]
2.1.2修改元素
通过[ ]关键字可以修改列表中某个位置的元素,类似的它也支持倒序以及切片的形式
## 修改 首个元素的值为100
a[0]=100
print(a)
[100, 2, 3, 4]
## 修改第0个元素 到 第一个元素,注意左闭右开不包含,第二各元素
a[0:2]=[100,200]
print(a)
## 利用这个切片也可以增加元素,在切片段增加元素
a[0:2]=[300,400,500]
print(a)
[100, 200, 500, 3, 4]
[300, 400, 500, 500, 3, 4]
2.1.3增加元素
增加 append 函数可以实现向列表尾部添加新的元素
## append 函数可以向列表尾部添加新的元素
a.append(300)
print(a)
a.append(400)
print(a)
[100, 200, 3, 4, 300]
[100, 200, 3, 4, 300, 400]
2.1.4删除元素
通过 del 关键字可以删除列表某个元素
## 删除列表首个元素
del a[0]
## 删除列表 最后一个元素
del a[-1]
print(a)
[200, 3, 4, 300]
2.1.5小练习的案例
运用列表的增删改查,完成下面的操作
Task 1. 在上一次期末考试中,XiaoHu 考了数学 65 分,语文 55 分;XiaoMing 考了数学 80 分,语文92 分;XiaoWei 考了数学 95 分,语文 98 分,以此建立学生成绩管理系统。
Task 2. 在本次期末考试中,XiaoHu 考了数学 95 分,语文 85 分;XiaoMing 考了数学 75 分,语文 71 分;XiaoWei 考了数学 92 分,语文 93 分,以此对之前的成绩进行更新。
Task 3. 由于 XiaoMing 的成绩出现了大幅度下滑,家长决定要 XiaoMing 转学到另一所高中,以此在系统中删除 XiaoMing 的信息。
Task 4. 学校新转来的学生 Cryin 本次考试成绩为 数学 87 分,语文 88 分,在系统中录入 Cryin 的成绩。
## Task 1 建立学生信息管理系统
## 建立一个 “名字” 列表记录那个学生在列表的那个位置
names=['XiaoHu','XiaoMing','XiaoWei']
## 根据名字列表的位置分别建立“数学成绩” “语文成绩”
Math_scores=[65,80,95]
Chinese_scores=[55,92,98]
## Task2 根据本次期中考试的乘积更新系统数据
## 首先找到“XiaoHu” 在那个位置,更新该位置的成绩
## 通过 for-in 循环便利名字元素
position = None
count =0
for name in names:
if name =="XiaoHu":
position=count
count=count+1
## Task3 根据 XiaoHu 在列表中的位置更新成绩
Math_scores[position]=95
Chinese_scores[position]=85
## 以同样的方法更新 XiaoMing 与 XiaoWei的成绩
position =None
count=0
for name in names:
if name == "XiaoMing":
position=count
count = count+1
Math_scores[position] =75
Chinese_scores[position]=71
print(name)
print(Math_scores)
print(Chinese_scores)
XiaoWei
[95, 75, 95]
[85, 71, 98]
2.2元组
元组与列表具有近乎一样的特性,他们唯一的区别在于元组无法被修改。由于不可修改的特性,元组一般用来保证存放数据的可靠性,例如用元组保存八大行星的名称,因为它们的名称不会被改变,也不会轻易减少:
planets = [ Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune]
元组只能用来查询,不能修改,不能增加元素,不能说删除元素。
t=(1,2,3,4)
print(t[0])
1
2.3字典
像查字典一样,有对应的主键,用来识别对应的数据,跟我的身份证号一样,通过这一串身份证号,我们就知道这是谁,每一个身份证都是独一无二的,字典也是这样的,每一个id对应一个数据,通过这个id或者说索引,我们就可以拿到这个数据。字典没有顺序,是无序的
,只能通过索引去查找我们的元素
字典的表示方式: a={“xiaoming”:“135”,“xiaohua”:“136”}
lw={
1:"xiaoming",
2:"xiaohuang",
3:"xiaogang",
4:"xiaobei"
}
print(lw[4])## 通过主键才能找到这个元素
xiaobei
字典有以下的操作
- 增:通过
[ ]
可以向列表内增加元素 - 删:通过
del
可以删除列表内元素 - 查:通过
[ ]
可以查找列表某个位置元素 - 改:通过
=
可以修改某个位置的元素
字典的优点是: - 快速检索到键对应的值
- 字典内的键值不存在顺序关系
2.31增加元素
## 增加元素
lw[5]="zhangsan"
print(lw)
2.32删除元素
## del()删除元素
del lw[3]
print(lw)
{1: 'xiaoming', 2: 'xiaohuang', 4: 'xiaobei', 5: 'zhangsan'}
2.33查找元素
## 通过[ ]查找元素
print(lw[2])
xiaohuang
2.34修改元素
## 修改元素
lw[1]="xiao er"
print(lw[1])
xiao er
2.35小练习
## 通过字典创建 Task1
Math_scores={
"XiaoHu":65,
"XiaoMing":80,
"XiaoWei":95
}
Chinese_scores={
"XiaoHu":55,
"XiaoMing":92,
"XiaoWei":98
}
## Task2 修改成绩
## 修改他们的数学成绩
Math_scores["XiaoHu"]=95
Math_scores["XiaoMing"]=75
Math_scores["XiaoWei"]=92
## 修改他们的语文成绩
Chinese_scores["XiaoHu"]=85
Chinese_scores["XiaoMing"]=71
Chinese_scores["XiaoWei"]=93
print(Math_scores)
print(Chinese_scores)
{'XiaoHu': 95, 'XiaoWei': 92, 'XiaoMing': 75}
{'XiaoHu': 85, 'XiaoWei': 93, 'XiaoMing': 71}
## Task3 删除 XiaoMing的信息
del Math_scores["XiaoMing"]
del Chinese_scores["XiaoMing"]
print(Math_scores)
print(Chinese_scores)
{'XiaoHu': 95, 'XiaoWei': 92}
{'XiaoHu': 85, 'XiaoWei': 93}
## Task4 录入Cryin的信息
lw[6]="Cryin"
Math_scores["Cryin"]=87
Chinese_scores["Cryin"]=88
print(Math_scores)
print(Chinese_scores)
{'XiaoHu': 95, 'XiaoWei': 92, 'Cryin': 87}
{'XiaoHu': 85, 'XiaoWei': 93, 'Cryin': 88}
2.4集合
集合是用来储存无序的元素的集合。通常我们只考虑元素的存在,而不考虑元素的顺序或出现的次数时使用集合
集合与字典一样也使用{花括号}
创建,但是不存在分隔符号。
注意
- 集合中不能存在重复元素
s={1,2,3,4}
集合支持一下操作
- 增:add添加
- 删:remove删除元素
- 查:关键字
in
可以查找某个元素是否在集合内
集合优点是: - 支持数学集合操作
- 快速检索某个元素是否在集合内
- 集合内的键值不存在顺序关系
2.4.1增加元素
### 2.2.4.1增加元素
## 增加新的元素到集合中
s.add(5)
print(s)
{1, 2, 3, 4, 5}
2.4.2删除元素
## 删除集合中某个元素
s.remove(5)
print(s)
{1, 2, 3, 4}
2.4.3查找元素
## 查找某个元素是否在集合中
print(4 in s)
print(6 in s)
True
False
2.4.4数学操作
## 创建另外一个集合
s2={3,4,5,6}
## 集合并集
print(s | s2)
{1, 2, 3, 4, 5, 6}
## 集合交集
print(s & s2)
{3, 4}
## 集合异或,即不属于交集剩余的部分
print(s ^ s2)
{1, 2, 5, 6}
2.5练习
2.5.1列表练习
- 给定两个大小分别为 m 和 n 的升序(从小到大)列表 nums1 和 nums2。请你找出并返回这两个升序列表的 中位数 。
- 例子:
- 输入:nums1 = [1,2], nums2 = [3,4]
- 输出:2.50000
- 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
## 列表练习
nums1=[1,2]
nums2=[3,4]
## 定义合并函数
def mer_ge(nums1,nums2):
result=[]
## 判断函数是否是空的
while len(nums1)>0 and len(nums2)>0:
## 如果不是空的话就对比首个元素的大小
if nums1[0] < nums2[0]:
## 如果第一个元素nums1小 那么就把这份元素添加到resut中
result.append(nums1[0])
## 并且去掉比较小的数组中的这个元素,重复上述的操作的
nums1=nums1[1:]
else:
result.append(nums2[0])
nums2=nums2[1:]
## 如果那个数组空了就把剩下的数组并到result中
result=result + nums1
result=result + nums2
return result
## 在合并后的列表中寻找中位数
def find_num(nums):
half=len(nums)//2
if len(nums)%2==0 :
return (nums[half-1]+nums[half])/2
else:
return nums[half]
find_num(mer_ge(nums1,nums2))
2.5
2.5.2字典练习
字典顾名思义就向现实世界中的字典一样,只要知道一个单词的读音,就能找到它在书中具体的位置。
即我们将一个键(key)与值(value)相关联,通过键迅速检索到对应的值。
注意一点键值必须是唯一的,这就好比两个单词如果读音一样就会出现歧义一样的。
给定一个整数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数
输入:nums=[2,7,11,15], target=9
输出:[2,7]
解释:因为 nums[0]+numse[1] ==9,返回[2,7]
## 定义一个列表
list=[2,7,11,15]
## 定义目标值target
target=9
# 定义一个遍历函数 for in 遍历 list序列查找里面的元素和等于target目标值的元素
for a in list:
## 用来找到要求的元素后停止循环的操作
fined=False
for b in list:
if a+b == target:
print([a,b])
fined=True
break
if fined:
break
[2, 7]
## 第二种方法
def check_sum(num1,num2,target):
a=num1
b=num2
## 返回判断a+b是否等于目标值 target
return a+b == target
## 定义函数寻找 list 的 a、b 遍历列表的元素
def twosum(nums,target):
finded=False
for a in nums:
for b in nums:
## 判断 a+b 是否等于target值
if check_sum(a,b,target):
return [a,b]
## 输入我们的定义列表
twosum(list,9)
[2, 7]
使用字典优化整个程序的时间复杂度
整个程序的时间复杂度是n平方
## 使用字典优化整个程序的时间复杂度,将整个程序的时间复杂度优化到n阶
def twosum1(list,target):
## 定义一个字典存储数据
hashtable={}
for num in list:
## 遍历字典 hashtable 找到这两个中相同的元素
if num in hashtable:
## 如果找到就返回这两个值
return [hashtable[num],num]
## 如果没有找到就把这个元素放到 hashtable里面
hashtable[target-num]=num
twosum1(list,9)
[2, 7]