- 摘要:本博客主要内容是自我对Python学习中列表内容的总结,并更新上期博客中求素数的算法优化更新。同样因尚在学习中,相关代码算法可能不够优秀,请各位看官见谅。
1、列表定义
排列整齐的序列,列表内由可以是任意对象的元素组成,并具备有序、线性、可变、可迭代、可索引的特点,使用[]来表示
- 列表list定义
与其他语言不同,列表无法一开始就定义大小
# 空列表
lst = list()
lst = []
# 定义实列表
lst=[2,6,9,'ab']
lst=list(range(5))
- PS:
(1) 列表与链表的区别
首先内存是线性分布的
列表(list)是一个线性、顺序、可变、可迭代、可索引的数据序列,在内存中是连续的空间,每个元素一个接一个,空间大小相同,在查询时可以直接偏移至索引处故相对较快,修改时会引起大规模元素内存位置调整故速度较慢
链表(link)虽是顺序、可变、可索引,上一个元素和下一个元素相互联系,但在内存中是分散分布、不是连续的,在查询时需通过一个个元素间的联系来查询,无法连续偏移故相对较慢;相对修改时仅影响前后元素的联系故速度较快
(2) 列表定义注意事项
lst = [range(5)] #[range(0,5)]中括号不会自动循环迭代
lst = list(5) #list()括号内需为可迭代对象,否则类型报错
2、列表索引访问
索引即下标,其中正索引是从左至右,从0开始;负索引是从右至左,从-1开始;且正负索引不可以超界,否则引发一场IndexError
list[index] #index就是索引,使用中括号访问
3、列表查询
- 列表查询(value)
通过值value,从指定区间查找列表内的元素是否匹配,匹配第一个就立即返回索引,匹配不到,抛出异常ValueError
index(value,[start,[stop]]) #start指索引搜索开始、stop指索引搜索结束
- 列表统计(count)
返回列表中匹配value的次数,没找到返回0,不返回异常
list.count(value) #统计值value出现次数
PS:count操作需遍历整个列表,时间复杂度为O(n),尽量少用
- 列表长度(len)
返回列表长度,即列表元素个数
len(list) #给出列表长度
4、列表元素修改
通过索引访问进行修改,注意索引不要超界
list[index] = value #修改某一索引对应的元素
5、列表增加、插入元素
- 尾部追加(append)
列表尾部追加元素,就地修改,返回None
list.append(object) #返回None
PS: 仅追加元素,不自动迭代
- 列表插入(insert)
在指定的索引index处插入元素object,就地修改,返回None
insert(index,object) #超越上界,尾部追加;超越下界,头部追加
- 尾部追加可迭代对象(extend)
将可迭代对象的元素追加进来,返回None
extend(iteratable)
- 列表相加(+)
连接操作,将两个列表连接起来,产生新的列表,原列表不变
list1 + list2 #返回新列表
- 列表重复(*)
重复操作,将本列表元素重复n次,返回新的列表
list * n #相乘引用类型时相当于浅复制,指向同一ID
6、列表删除元素
- 列表元素匹配删除(remove)
从左至右查找第一个匹配value的值,直接移除,就地修改
list.remove(value) #返回None
- 列表元素索引删除(pop)
(1) 不指定索引index,就从列表尾部弹出一个
list.pop() #尾部弹出一个元素
(2) 指定索引index,就从索引处弹出一个元素
list.pop(index) #索引处弹出一个元素
- 列表清除(clear)
清除列表所有元素,剩下一个空列表
list.clear()
7、列表其他操作
- 列表反转(reverse)
将列表元素反转,返回None
list.reverse() #就地修改
- 列表排序(sort)
对列表元素进行排序,就地修改,默认升序
list.sort(key=None,reverse=False) #key:指定如何排序 reverse:False为默认升序、True为降序
- 成员(in)
[3,4] in [1,2,[3,4]] #输出布尔型True
8、列表复制
- 浅复制(shadow copy)
浅拷贝,遇到引用类型,仅复制地址引用而已。
list.copy() #浅复制引用类型,后续若修改引用类型,列表数据将同步修改
- 深拷贝(deepcopy)
import copy
copy.deepcopy(list) #深拷贝完整复制引用类型,后续修改引用类型对拷贝的列表不影响
9、列表练习——求素数算法优化
通过列表储存上一次算出的素数,以不断利用以往计算结果提升运算效率
lst = [2,3]
count = 0
n = 5
step = 2
while n < 100:
tmp = n ** 0.5 #提前计算n的平方根,避免在第二次循环中每次都要计算
flag = False
for j in lst:
if n % j == 0:
flag = True
if j > tmp: #j仅需算到i**0.5处即可
break
if not flag: #通过标记整合
lst.append(n)
count +=1
n += step
step = 4 if step == 2 else 2 #利用大于3的素数一定和6的倍数相邻性质提升效率
print(count)