线性表:
线性表是一种抽象数学概念,是一组元素的序列,由有穷个元素组成。
顺序表:使用一大块连续内存顺序存储表中的元素,这样实现的表称为顺序表,或称为连续表。顺序表中,元素的关系使用顺序表的存储顺序自然地表示。
链接表: 在存储空间中将分散存储的元素链接起来,这种实现称为链接表,简称为链表。
list 概念:
list是python的基础内置结构,是一种线性表。
list可变,所以不可以hash.
ls1 = []
ls2 = list()
ls3 = [2, 'ab']
ls4 = list(range(5)) #非常常用的构造方式,将一个可迭代对象转换成一个list
主要有:append(), insert(), extend() 三个方法:
append(object) #这个方法会增加元素到最后。
insert(index, object) # 在指顶的索引index处插入元素object, 返回None就意味没有新的列表产生,
* insert的index超越最大index,尾部追加。
*insert的index低于最小index,头部插入。
如果增加多个元素,使用extend(iteratable)方法。 可以将迭代对象的元素取出,append到list尾部,返回None。
+
可以将两个列表连接起来,但是不会修改初始list。
*
将本列表元素重复N次,返回新的列表。
在修改元素的时候要特别注意:
情况一:
x = [1] * 3
x[0] = 100
print(x) # [100, 1, 1]
情况二:
y = [[1]] *3
print(y) # [[1], [1], [1]]
y[1][0] = 4
print(y) # [[4], [4], [4]]
简单类型的直接存储在list中, 而引入类型只是把引用地址存在了list表中。不注意修改到引用类型的时候可能会出引发如情况二深浅复制的问题。
主要是remove(), pop(), clear() 三个方法:
remove(value) -> None #从左到右边查找到第一个匹配value的值, 找到就移除该元素,并返回None,否则ValueError。
pop([index]) -> item # 1.不指定index就从尾部弹出一个元素。2. 指定index,就从索引处弹出一个元素,index越界抛出indexError错误。
clear() --> None # 清除列表所有元素,剩下一个空list。
reverse() ->None # 就地将list元素反转,返回None。 就地修改
这个方法最好不用,可以倒着读取,都不要反转。
sort(key=None, reverse=False) ->None # 对列表元素进行排序,就地修改,默认升序。 reverse为True,反转,降序。ke也可以指定函数,指定如何排序。
for a in []: 如果成立则执行循环,
pass
[1,2] in [1,2,'abc'] # False
[1,2] in [[1,2],'abc'] # True
通常情况下 =
赋值是引用。
==
判断内容是否相等 A is B
判断了id是否相等。
第一种情况:
a = list(range(4))
b = list(range(4))
print(a == b) # True
c = a # 这里只能叫引用。
c[2] = 10
print(a == b) # False
print(a == c) # True
id(a),id(c) # (4625032688, 4625032688)
a is c # True
第二种情况:
a = list(range(4))
b = a.copy() # copy不进行地址追踪,是浅copy。遇到引用类型数据,仅仅复制一个引用而已。
id(a), id(b) # (4624528400, 4624882976)
a is b # False
a == b # True
a=[1,2,3]
b=[1,2,3]
c=[1,a,3]
d=[1,b,3]
c == d # True == 符号是进行内容比较。如果内部是不同变量。还会比较变量的内容
c is d #Flase
一般情况下,大多数语言的默认复制行为都是浅copy。
深copy:
import copy
a = [1,[2,3],4]
b = copy.deepcopy(a)
print(a == b) # True
a[1][1] =100
print(a == b) # False
print(a) # [1,[2,100], 4]
print(b) # [1,[2,3],4]
len()的效率较高。复杂度,O(1) 包装C语言的数组,记录一个数据—列表的长度1 初始化时候使用过。
append()在操作的时候如果当时分配内存已使用完,会分配新内存给list。
insert() 插入数据复杂度为O(n).
remove() 按照value来的,复杂度O(n).
pop() 弹出来,使用索引只能保证定位快,移除元素后挪动效率不高。
pop()尾部移除,建议使用。
链表可以加索引。定位数据是遍历index。O(n), 找到后,插入数据,就是手拉手断开,重新拉新元素。
删除,头尾移除效率很高。中间,要遍历找到被删除的元素。找到后,断开手,重新拉手。
元素规模较大,增删频繁,尽量使用链表。
如果只在尾部操作增删,链表顺序表都行。
改不高, 查到就改。
顺序表用索引效率最高。
索引定位,也不高,因为需要遍历。
5.遍历:
顺序表和链表,都不高,都是O(n).
先进先出队列用链表。后进先出都可以(但看到的可能都是链表。)