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 统计一个列表每个元素出现的次数,计算重复的
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()返回字典的列表形式
结语
这三个集合类型的数据结构,可以把数据以合适的方式组织。好好领悟具体用法吧,但是感觉好像算法更重要一点…