2-Python 数据结构

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可以删除列表内元素
  • 查:通过关键字[ ] 可以查找列表某个位置元素
  • 改:通过赋值符号 = 可以修改某个元素

列表的优点是:

  1. 快速向尾部添加元素
  2. 快速遍历所有元素
  3. 节省占用计算机内容空间

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值