Python学习总结——列表知识点总结及优化求素数算法后续

  • 摘要:本博客主要内容是自我对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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值