【python超全超详细学习笔记 3--基础数据结构】

0.概论

python是一种多范式编程语言–>面向过程+面向对象

  • 首先,我们应该知道为什么学习数据结构
    –>因为程序设计的基本要素=算法+数据结构
    (算法=解决问题的步骤与规则,你要用什么方法解决问题;数据结构=计算机中数据的组织方式,以什么样的结构存储和被使用)

  • 其次,我们需要知道python中基础的数据结构(集合类型)有什么?
    –>主要有List(列表) / Dictionary(字典) / Tuple(元组)

  • 最后,我们需要知道把数据转成数据结构的好处?
    –>它可以让零散的数据以一些方式放在一起,便于处理问题过程中对它们的操作和调取(以上是我自己的理解,如有不妥恳请指出!)

1.列表(list)

1.1 列表的基础概念

1.1.1 列表通识

  • 列表是可变对象,即里面的元素可以被修改
  • 列表的元素可以是不同的数据类型,即可以混合的,可以是int/str/list等,元素可以重复
  • 列表的有索引,从0开始,可以使用len()知道列表的长度;想知道列表某个位置的值,可以使用索引,list[x]x可正可负,代表正着数还是倒着数。对于超出范围的用不了;
  • 列表有切片[开始:结束:跨度],整理提取出某些位置的值

1.1.2 二维列表

Q:什么是二维列表?
–>一维列表的元素又是一个一维列表;

  • 索引的时候可以定位到最小列表单元中的元素
    –>用多个[ ]即可,它的它
    在这里插入图片描述

1.2 列表的简单操作

1.2.0 列表表达式

  • 如何创建列表?
    l0=['x',1,2,'y'] #直接有元素的列表
    l1=[] #创建空列表
    l2=list() #效果和l1一样
  • 可以使用* -->创建5x3的二维列表,default=0
l0=[[0]*3]*5
print(l0)

#运行结果如下:
#[[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]

1.2.1 列表合并相加

  • 列表是可以运用 +运算符的,list2整个添加到list1的后面
l1=['zdn']
l0=['*']
l2=['is',666]
l3=l1+l0+l2
print(l3) 

#运行结果如下:
#['zdn', '*', 'is', 666]

1.2.2 检查搜索某个元素在列表吗

1.2.2.a 返回true/false
  • 用一个variable承接‘元素’ in ‘列表’的返回值,告诉你元素在不在列表里面
name=['赵','钱','孙','李']
is_in='李'in name
print(is_in)   #True
is_in='曾' in name
print(is_in)  #False
1.2.2.b 如果在->返回下标(第一个)
  • 用一个variable承接 index('元素') 返回的下标值,它是一个函数;但是如果元素在列表中出现多次,只返回第一个的
  • 函数说明:index(value[,start[,stop]),value是你要搜索的元素值,start-stop老规矩左闭右开,即确定搜索的范围
name=['赵','李','钱','孙','李']
in_dex=name.index('李')
print(in_dex)  # 1
in_dex=name.index('李',2)
print(in_dex)  # 4
in_dex=name.index('曾')
print(in_dex)  #报错ValueError: '曾' is not in list

1.2.3 向列表增加元素

1.2.3.a 向末尾加
  • append()函数
  • 函数说明:直接append(x),表示把x放在列表的后面
name=['赵','李','钱','孙','李']
name.append('曾')
print(name)

#运行结果如下:
#['赵', '李', '钱', '孙', '李', '曾']
1.2.3.b 向中间插入
  • insert()函数
  • 函数说明:insert(位置,元素),告诉它你要在哪个位置,放什么元素;后面所有元素自动往后移动一位
name=['赵','李','钱','孙','李']
name.insert(2,'曾')
print(name)

#运行结果如下:
#['赵', '李', '曾', '钱', '孙', '李']

1.2.4 删除列表元素

1.2.4.a 删除指定位置的值
  • 使用del关键字,类型方面类似于in的存在,它不是函数
  • 使用说明:TypeError: list indices must be integers or slices(针对于二维等多维), not str,所以不能在[ ]里写元素值
name=['赵','钱','孙','李']
del name[2]
print(name)

#运行结果如下:
#['赵', '钱', '李']
1.2.4.b 删除某个值(第一个)
  • 使用remove()函数
  • 函数说明:直接移除第一个出现的元素,找不到就报错,真任性ValueError: list.remove(x): x not in list
name=['赵','钱','孙','李','孙']
name.remove('孙')
print(name)

#运行结果如下:
#['赵', '钱', '李','孙']

1.2.5 给元素排序

  • sort()函数,从小到大
  • 函数说明:
    1.如果元素是数字,就比大小,从小到大;
    2.如果是字符串,就比字母表顺序,先比第一个字母,同比第二个字母,以此类推;
    3.如果列表是多维的,就先比先比每个元素的第一个,再第二个;
    4.如果元素是中文字符,则安装特殊方式排序(不是拼音首字母)
  • 注:这个函数很坑,它是对原列表进行排序,没有返回值;不可以print(num.sort())或者num_=num.sort(),会返回None

在中文字符排序时,一般使用的是 Unicode 的排序规则来确定字符的顺序。Unicode 中每个字符都有一个唯一的代码点来表示,根据这些代码点来确定字符的排序顺序。locale 模块中的 strcoll 和 strxfrm 方法会根据当前的本地化环境,使用 Unicode 排序规则对字符串进行处理和比较,以实现按照中文字符的顺序进行排序。
需要注意的是,为了正确地进行中文字符的排序,你可能需要在操作系统中安装相应的中文语言包,确保locale中有相应的中文环境配置。此外,strxfrm 方法会对字符串进行转换,可能会有一些性能开销,所以请根据实际情况评估使用的适用性。

num=[5,9,5,-5,3,1,0,8]
str=['a','g','c','A','f']
_2D=[[5,4],[5,3],[3,0],[1,6],[2,7]]
name=['赵','钱','孙','李']
num.sort()
str.sort()
_2D.sort()
name.sort()
print(num) #[-5, 0, 1, 3, 5, 5, 8, 9]
print(str) #['A', 'a', 'c', 'f', 'g']
print(_2D) #[[1, 6], [2, 7], [3, 0], [5, 3], [5, 4]]
print(name) #['孙', '李', '赵', '钱']

1.2.6 复制列表

1.2.6.a 直接赋值<=>浅拷贝
  • 是引用,都指向同一个存储空间
  • 操作说明:直接赋值,会有联通效应->一个变另外一个也变;除非特定情况,不然两个同步的为什么要多创建一个变量哈哈~
    在这里插入图片描述
a=[1,2,3,4]
b=a
print(a,b) #[1, 2, 3, 4] [1, 2, 3, 4]
b[1]='newb'
print(a,b) #[1, 'newb', 3, 4] [1, 'newb', 3, 4]
a[0]='newa'
print(a,b) #['newa', 'newb', 3, 4] ['newa', 'newb', 3, 4]
1.2.6.b 使用内置的copy()函数(一维list深拷贝)
  • 函数说明:这个copy()函数是内置的,它可以实现对一维列表的深拷贝,就是不会指向同一个内存位置,而是新建了一个内存
    在这里插入图片描述
a=[1,2,3,4]
b=a.copy()
print(a,b) #[1, 2, 3, 4] [1, 2, 3, 4]
b[1]='newb'
print(a,b) #[1, 2, 3, 4] [1, 'newb', 3, 4]
  • 为什么强调说是一维列表的深拷贝?
    –>因为对于二维列表,仍然会发生浅拷贝;它只有第一层的元素是深拷贝,第二层就是浅拷贝了,见下面代码
    在这里插入图片描述
a=[[1,2,3],['a','b','c']]
b=a.copy()
print(a,b) #[[1, 2, 3], ['a', 'b', 'c']] [[1, 2, 3], ['a', 'b', 'c']]
b[1]='newb'
print(a,b) #[[1, 2, 3], ['a', 'b', 'c']] [[1, 2, 3], 'newb']
a[0][1]='newa'
print(a,b) #[[1, 'newa', 3], ['a', 'b', 'c']] [[1, 'newa', 3], 'newb']
1.2.6.c 实现稳定的深拷贝

–>为了稳定一点的复制,我们不管是一维列表还是二维列表都可以直接使用imort copy模块的deepcope()函数,省得容易出错

  • 使用说明:要写成copy.deepcopy(x),表示copy模块的deepcopy函数,要复制的东西放在括号里
  • 注:这里的copy模块不要和1.2.6.a写的内置copy()函数混淆~
import copy
a=[[1,2,3],['a','b','c']]
b=copy.deepcopy(a)
print(a,b) #[[1, 2, 3], ['a', 'b', 'c']] [[1, 2, 3], ['a', 'b', 'c']]
b[1]='newb'
print(a,b) #[[1, 2, 3], ['a', 'b', 'c']] [[1, 2, 3], 'newb']
a[0][1]='newa'
print(a,b) #[[1, 'newa', 3], ['a', 'b', 'c']] [[1, 2, 3], 'newb']

1.2.7 list的方法合集(图片)

  • (与tuple元组共用)
    在这里插入图片描述
  • (与可变序列共用)
    在这里插入图片描述

2.字典(dictionary)

2.1 字典的基础概念

2.1.1 通识

  • 字典是python的一个特色数据结构,可变对象,可以实现类似于数据库的功能管理数据(但是不多哈哈);
  • 其实别的编程语言中也有类似于字典的结构,只是叫法不同;
    如:C#(sharp) --> Property Bag
    Java --> Properties/Map/Hashmap
    PHP/Perl --> Associative Arrays

2.1.2 字典表达式

字典有key:value,放在{ 花括号 }里(列表是放在[ 框框 ])

  • 如何创建字典?
    d0={'赵':1000,'钱':5500,'孙':3000,'李':9800} #直接有东西的字典(使用:)
    d1={} # 创建空字典
    d2=dict() #实例化d2为字典,同d1

2.2 字典常用的使用操作

2.2.1 添加或者修改字典内容

  • 格式为字典名[key(你给它贴的标签)]=它
wages=dict()
wages['赵']=1000
wages['钱']=3000
print(wages) #{'赵': 1000, '钱': 3000}
wages['钱']=5000 #直接改就可以
print(wages) #{'赵': 1000, '钱': 5000}

2.2.2 统计一个列表每个元素出现的次数,计算重复的

  • 也可以看作是无键值value的字典的赋值
  • 2.2.2.a 通过in关键词
wages=dict()
names=['赵','钱','孙','李','钱','钱','李']
for name in names:
    if name not in wages:
        wages[name]=1
    else:
        wages[name]=wages[name]+1
print(wages)

#运行结果如下:
#{'赵': 1, '钱': 3, '孙': 1, '李': 2}
2.2.2.b 通过get()函数

函数说明:get(key[,default)
使用说明:get()函数可以返回key对应的键值。如果key没有值就返回后面我们给的default值,如果没给default的值就是默认None;所以如果原来键没有对应的值也不会引起错误

wages=dict()
names=['赵','钱','孙','李','钱','钱','李']
for name in names:
    wages[name]=wages.get(name,0)+1
print(wages)

#运行结果如下:
#{'赵': 1, '钱': 3, '孙': 1, '李': 2}

2.2.3 items()返回字典的列表形式

Q:items()直接返回的不能直接用里面的一对,怎么办?
–>要用list()转成真list
注:返回的[ ]里的每一个元素都是元组,

dic1={'赵':1000,'钱':5500,'孙':3000,'李':9800}
dic=dic1.items()
print(dic) #dict_items([('赵', 1000), ('钱', 5500), ('孙', 3000), ('李', 9800)])
print(dic[1]) #报错'dict_items' object is not subscriptable
#需要转换成真list形式才能使用
dic2={'赵':1000,'钱':5500,'孙':3000,'李':9800}
dic=list(dic2.items())
print(dic) #[('赵', 1000), ('钱', 5500), ('孙', 3000), ('李', 9800)]
print(dic[1]) #('钱', 5500)

2.3 列表和字典的比较

在这里插入图片描述

在这里插入图片描述

  • 列表:元素是有顺序索引的线性排列在一个容器里,通过索引下标index找它们
  • 字典:元素们都了一个label标签,但是散乱无序的放在一个容器里,通过标签key找它们

在这里插入图片描述

3.元组(tuple)

3.1 元组的基础概念

3.1.1 元组通识

  • 元组是不可变对象,所以元组的元素一旦确定后面不可以修改,会报错TypeError:'tuple'objectdoesnotsupport itemassignment;而且也不能排序,添加,反转之类的变换操作
  • 元组与列表相似;元组用(圆括号)(列表则是[ 方括号]罢了)
  • 元组有下标索引

3.1.2 元组的表达式

元组中的元素不能被重新赋值,但是元组本身可以被赋值,相当于创建

(a,b)=(1,2)
print a #1
print b #2
 a,b=1,2 #有点像变量赋值
 c=1,2
 print c #(1,2)

3.2 元组的常用操作

3.2.1 元组作为函数的返回值

#这是个交换两个值的自定义函数
def swap(a,b):
    temp=a
    a=b
    b=temp
    return a,b
a,b=swap(3,4) #变成赋值了
print(a,b) #4 3
c=swap(3,4) 
print(c) #(4, 3)

3.2.2 元组在字典中的体现

见上面的 2.2.3 items()返回字典的列表形式

结语

这三个集合类型的数据结构,可以把数据以合适的方式组织。好好领悟具体用法吧,但是感觉好像算法更重要一点…

  • 57
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值