python内置数据结构基础认知:列表与元组
内置数据结构分类:
数值类:int(整型)、float(浮点型)、complex(负数)、bool(布尔型)
序列对象:str(字符串)、list(列表)、tuple(元组)
键值对:set(集合)、dict(字典)
数字的处理函数:
int() # 从小数点截断,直接取整数部分
// # 整除且向下取整,例如:-1//3=-1;2//3=0;7//-2=-4;-7//2=-4
round() # 四舍六入五取偶(取离它最近的偶数;round(-2.5)=-2;round(3.5)=4;round(-3.5)=-4)
先import math(导入math模块),才能使用以下函数
math.floor() # 地板,向下取值;例如:math.floor(2.5)=2;math.floor(-2.5)=-3
math.ceil() # 天花板,向上取值;例如:math.floor(2.5)=3;math.floor(-2.5)=-2
math.sqrt() # 开平方
math.pi 为π;math.e 为自然常数e
进制函数:bin() # 返回二进制
oct() #返回8进制
hex() #返回16进制
类型判断:
type(obj) #判断并返回类型,返回的类型不是以字符串形式表现的
例如:type('a')返回str,而不是'str'
isinstance(obj,class_or_tuple) # 判断obj是不是属于右边列出来的类型,返回布尔值
例如:isinstance(6,str)返回False;isinstance(6,(str,int,bool))返回True
列表list:
列表[ ]:可变,有序;可随时追加元素、插入元素或删除元素
queue:有序;只能先进先出(从头出),后进先出(从尾出)
链表:散落在内存中的元素以某种方式连接在一起形成一个链状列表
stack:只可后进先出
可索引一定可迭代,可迭代不一定可索引
list() # 创建一个空的新列表,例如:L=list()即是L=[]
list(iterable) # ()里放入可迭代对象即可创建一个包含可迭代对象的所有元素的列表,继承元素的属性
时间复杂度:
O(n):随着列表数据规模的增大而效率下降
O(1):对效率几乎没影响
.index(value) -> index #在指定区间查找列表中的value的索引(从左到右第一个value的索引);O(n)
.count(value) # 返回列表中匹配value的次数;O(n)
.reverse() -> None # 将列表元素反转,就地修改
列表增加元素:
.append(obj) -> None # 在列表尾部追加元素;返回None意味着就地修改,没有新列表产生;O(1)
.insert(index,obj) -> None # 在指定的索引处插入元素obj;O(n);可以超索引添加(在头部或尾部添加)
.extend(iteratable) ->None # 将可迭代的对象追加进来,就地修改,不产生新列表
+ -> new list # 将两个列表链接起来,产生一个新列表,原来的列表不变
* -> new list # 将列表的元素当作整体复制n次,生成一个新列表
# 特别注意:x=[4,[1,2,3],5]*3,虽然x中确实显示[1,2,3]有三份,但实际上列表[1,2,3]并没有被复制三份,列表x中仅仅是有三份指针(均指向[1,2,3]);令x[1][1]=20,则列表x中三份[1,2,3]均变成[1,20,3];而4,5则是真正各复制了三份,对x中不同位置的4或5进行修改不会改变其他位置上的4或5
列表删除元素:
.pop([index]) ->item # 不指定索引,默认从尾部弹出一个元素,O(1)
指定索引,从索引位置弹出一个元素,O(n)
.remove(value) ->None # 删除第一个匹配value的值,并移除,就地修改;O(n)
.clear() ->None # 清楚列表所有元素,剩下一个空列表
.sort(key=None,reverse=False) -> None # 对列表进行排序,key表示对列表里的元素先进行类型转换,再进行排序;reverse=True表示排序后再反转
列表复制:
= # 无论对新列表或原列表第几层进行修改都会同时改变两个列表(若有其他变量同样指向该列表也会同等的变化)
.copy() -> list # 浅拷贝,简单类型(数字,字符串等)相当于直接复制一份,复杂类型(列表等)只是拷贝了一个内存地址;对新列表第一层进行修改不影响原列表;对新列表深层(2,3层等)进行修改也会等同于同时修改原列表和新列表。
.deepcopy() -> list # 深拷贝,简单类型与复杂类型均相当于直接复制了一份,无论对新列表第几层进行修改都不会改变原列表
随机数:
random模块
random.randint(a,b) # 随机返回[a,b]之间的整数
random.choice(seq) # 随机返回序列的一个元素;例如random.choice([5,2,6,4])即从四个元素中
随机挑选一个
random.randrange([stat,] stop [step,]) # 随机返回一个值,可以指定步跳
random.shyffle(list) -> None # 就地打乱列表元素
random.sample(population,K) ->list # 从样本空间或总体(序列或集合类型)中随机取出k个不同的元素,返回一个新的列表;例如:random.sample(['a','b','c','d'],2)
元组tuple():有序元素组成的集合,不可变对象(简单认为是不可变的列表,不可增删改)
tuple() -> tuple # 返回一个空元组
tuple(iterable) # ()里放入可迭代对象即可创建一个包含可迭代对象的所有元素的列表,继承元素的属性
t = (1,) #只有一个元素的tuple需要在元素后面加个逗号