列表list(索引快,增删慢)
一个由若干有序元素组成的线性的可变的数据结构叫列表;
(1)列表使用中括号 [ ] 表示;
(2)列表内元素是有顺序的,可以索引;
(3)列表是线性的数据结构;
(4)列表是可变的;
链表(增删快,索引慢)
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作。
列表与链表的区别:
(1)列表开辟的内存空间是一块连续的内存,他是连续存储的;而链表在内存中是非连续,非顺序的存储结构;
(2)列表索引快,增删操作慢;链表索引慢,增删操作快;
队列queue
队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在 表的前端(front)进行删除操作 ,而在 表的后端(rear)进行插入操作 。
栈stack
栈(stack)仅在 表尾进行插入或删除操作 的线性表。栈是一种数据结构,它按照后进先出的原则存储数据;
队列queue和栈stack的区别:
(1)队列先进先出(无底的管道);栈先进后出(有底的管道);
(2)队列只能在表头进行删除操作,表尾进行插入操作;栈是只能在表尾进行插入和删除操作;
(3)队列遍历数据比栈快;
1、列表的定义:
list( [iterable] ) 或 lst = [ ]
注意:列表不能一开始就定义大小;
2、列表的索引访问:
list[ index ],index就是索引,使用中括号访问;
注意:索引不能越界否则会报IndexError错误;
3、列表的查询:
index( value,[start,[stop] ] )
(1)通过值value,从指定区间查找列表内的元素是否匹配;
(2) 匹配到第一个就立即返回索引,不在匹配之后的元素;
(3)匹配不到,抛出ValueError错误;
count(value):返回列表中匹配value的次数;
len():返回列表元素的个数;
时间复杂度:
index 和 count 方法都是O(n),随着列表数据规模的增大,而效率下降;所以为了程序的效率少使用 index 和 count 方法;
4、列表元素的修改
索引访问修改:
list[ index ] = value
注意:索引不要越界;
5、列表增加、插入元素
append( object ) → None
(1)列表尾部追加元素,返回None(返回None意味这没有产生新的列表,在原列表上就地修改)
(2)时间复杂度:O(1)
insert( index,object ) → None
(1)在指定索引index处插入元素object,返回None(返回None意味这没有产生新的列表,在原列表上就地修改)
(2)时间复杂度:O(n)
(3)索引可以越界吗?
【1】索引超上界,尾部追加;
【2】索引超下界,头部追加;
extend( iteratable ) → None
(1)将可迭代对象的元素追加进来,返回None(返回None意味这没有产生新的列表,在原列表上就地修改)
+ → list
(1)连接操作,将两个列表连接起来,产生新的列表,原列表不变;
(2)本质上调用的是 _add_() 方法;
* → list
(1)重复操作,将本列表元素重复 n 次,返回新的列表,原列表不变;
6、列表删除元素
remove( value ) → None
(1)从左至右查找第一个匹配value的值,移除该元素,返回None(返回None意味这没有产生新的列表,在原列表上就地修改)
(2)时间复杂度:O(n) 效率低
pop( [ index ] ) → item
(1)不指定索引index,就从列表尾部弹出一个元素;
(2)指定索引index,就从索引处弹出一个元素,索引越界抛出IndexError错误;
(3)时间复杂度:不指定index时:O(1) 、 指定index时:O(n)【指定index时,删除索引处元素,索引后方的元素前移索引效率低】
clear() → None
(1)清除列表所有元素,剩下一个空列表;
7、列表的其他操作
reverse() → None
(1)将列表元素反转,返回None(返回None意味这没有产生新的列表,在原列表上就地修改)
sort(key=None,reverse=False) → None
(1)对列表元素进行排序,就地修改,默认升序;
(2)reverse为True,反转,降序;
(3)key一个函数,指定key如何排序;
eg:lst.sort(key = functionname)
in
eg:[3 , 4] in [1,2,[3,4]]
for x in [1,2,3,4]
8、列表复制
copy() → List
(1)copy后返回一个新列表;
(2)注意浅拷贝,深拷贝概念;
深拷贝:copy模块提供了deepcopy;
eg:import copy
lst0 = [1,[2,3,4],5]
lst5 = copy.deepcopy(lst0)
lst5[1][1] = 20
lst5 == lst0#False
9、随机数
random模块
(1)randint( a,b ):返回 [ a,b ] 之间的整数;【注意a,b此时是前包后包的】
(2)choice( seq ):从非空序列的元素中随机挑选一个元素;eg:random.choice( range(10) ),从0到9中随机挑选一个整数。random.choice( [1,3,5,7] )
(3)randrange( [start,] stop [,step] ):从指定范围内,按指定基数递增的集合中获取一个随机数,基数缺省值为1。eg:random.randrange(1,7,2):【 [1,7,2) 】
(4)random.shuffle(list) → None 就地打乱列表元素
(5)sample(population,k) → List:从样本空间或总体(序列或者集合类型)中随机取出k个不同的元素,返回一个新列表;