python内置数据结构
list
list是Python内置的一种数据类型是列表,是一种有序的集合,可以随时添加和删除其中的元素。和java中的list基本相同。
L = ['Apple', 123, True]
tuple
在java中没有对应类型。tuple和list非常类似,但是tuple一旦初始化就不能修改。因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。
>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])
tuple中list里的元素是可变的。
set
set和java中的set类似,他存储的值是唯一的。
要创建一个set,需要提供一个list作为输入集合
>>> s = set([1, 2, 3])
>>> s
{1, 2, 3}
dict
Python内置了字典:dict的支持,dict全称dictionary,对应java中的map,使用键-值(key-value)存储,具有极快的查找速度(按位置做索引,不会随着字典大小的增加而变慢)
和list比较,dict有以下几个特点:
查找和插入的速度极快,不会随着key的增加而变慢;
需要占用大量的内存,内存浪费多。
而list相反:
查找和插入的时间随着元素的增加而增加;
占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
数据结构引入
举例:存储学生信息
比如我要存储name,age,home
我们如何用Python中的类型来保存一个班的学生信息? 如果想要快速的通过学生姓名获取其信息呢?
# list里面放tuple
[
("zhangsan", 23, "beijing"),
("zhangsan", 23, "beijing"),
("zhangsan", 23, "beijing"),
]
# list里面放dict
[
{
"name": "zhangsan",
"age": 23,
"home":"beijing"
},
{
"name": "zhangsan",
"age": 23,
"home":"beijing"
},
]
# dict 里存dict
{
"zhangsan":{"age":23,"home":"beijing"},
"zhangsan":{"age":23,"home":"beijing"},
}
实际上当我们在思考这个问题的时候,我们已经用到了数据结构。列表和字典都可以存储一个班的学生信息,但是想要在列表中获取一名同学的信息时,就要遍历这个列表,其时间复杂度为O(n),而使用字典存储时,可将学生姓名作为字典的键,学生信息作为值,进而查询时不需要遍历便可快速获取到学生信息,其时间复杂度为O(1)。当然如果出现重名,我们可以给不同学生编号或其他解决方案。
数据结构概念
对于一组数据,是已什么样的方式组织存储,这就是数据结构。解决的就是一组数据以何种形式保存。
在上面的问题中我们可以选择Python中的列表或字典来存储学生信息。列表和字典就是Python内建帮我们封装好的两种数据结构。
数据是一个抽象的概念,将其进行分类后得到程序设计语言中的基本类型。如:int,float,char等。数据结构就是对基本数据类型的一次封装。
Python给我们提供了很多现成的数据结构类型,这些系统自己定义好的,不需要我们自己去定义的数据结构叫做Python的内置数据结构,比如列表、元组、字典。而有些数据组织方式,Python系统里面没有直接定义,需要我们自己去定义实现这些数据的组织方式,这些数据组织方式称之为Python的扩展数据结构,比如栈,队列等。
算法和数据结构的区别
程序 = 数据结构 + 算法
总结:算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体
抽象数据类型(Abstract Data Type)
把原有的基本数据和数据所支持的操作放到一起形成一个整体。
抽象数据类型(ADT)的含义是指一个数学模型以及定义在此数学模型上的一组操作。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。
最常用的数据运算有五种:增删改查排
插入
删除
修改
查找
排序