关于list的insert函数

list#insert(ind,value)在ind元素前面插入value

首先对ind进行预处理:如果ind<0,则ind+=len(a),这样一来ind就变成了正数下标

预处理之后,

当ind<0时,ind=0,相当于头部插入

当ind>len(a)时,ind=len(a),相当于尾部插入

切片实例

Python中的列表切片非常灵活,要根据表象来分析它的内在机理,这样用起来才能溜。

下标可以为负数有利有弊,好处是使用起来更简便,坏处是当我下表越界了我也不知道反倒发生奇奇怪怪的错误。

print str[0:3] #截取第一位到第三位的字符

print str[:] #截取字符串的全部字符

print str[6:] #截取第七个字符到结尾

print str[:-3] #截取从头开始到倒数第三个字符之前

print str[2] #截取第三个字符

print str[-1] #截取倒数第一个字符

print str[::-1] #创造一个与原字符串顺序相反的字符串

print str[-3:-1] #截取倒数第三位与倒数第一位之前的字符

print str[-3:] #截取倒数第三位到结尾

print str[:-5:-3] #逆序截取

可见,列表的下标有三个参数:beg(起始下标),end(终止下标),delta(变化量)

当delta小于0时,beg默认为len(array)-1,end默认为开头之前。

当delta大于0时,beg默认为0,end默认为最末之后。

当delta未给出时:delta默认为1

这个代码示例演示了大概原理,学习一件事物,先学习它的表象,然后分析它的内在实现,最后查看源代码仔细推敲它到底是怎么实现的。

需要注意的是,列表切片产生的是列表的副本,与原列表不是同一份空间。

x=[1,2,3]

y=x[:]

x[0]=-1

print(y) #输出[1,2,3]

列表切片写操作

接下来探究切片的写操作

>>> x=[1,2,3,4,5]

>>> x[2:0]=100 #在2后面插入若干个元素,应该用列表

Traceback (most recent call last):

File "", line 1, in

TypeError: can only assign an iterable

>>> x[2:0]=[100]

>>> x

[1, 2, 100, 3, 4, 5]

>>> del x[2:3] #删除切片

>>> x

[1, 2, 3, 4, 5]

>>> x[2:1]=[100] #对于切片x[from:to],会进行预处理to=max(from+1,to)

>>> x

[1, 2, 100, 3, 4, 5]

>>> del x[2:0] #对于切片del操作,如果from>to,不执行任何操作

>>> x

[1, 2, 100, 3, 4, 5]

>>> del x[2:1]

>>> x

[1, 2, 100, 3, 4, 5]

>>> del x[2:3]

>>> x

[1, 2, 3, 4, 5]

>>> x[2:4]=None

Traceback (most recent call last):

File "", line 1, in

TypeError: can only assign an iterable

>>> x[2:4]=[None]

>>> x

[1, 2, None, 5]

对列表切片进行深入理解:

def between(beg, end, mid):

# 判断mid是否位于begin和end之间

return end > mid >= beg or end < mid <= beg

def get_slice(a, beg, end, delta=1):

# 数组切片get方式

if delta == 0: raise ValueError("slice step cannot be 0")

# 将负数下标转化一下

if beg < 0: beg += len(a)

if end < 0: end += len(a)

# 如果转化完成之后依然不在合法范围内,则返回空列表

if beg < 0 and end < 0 or beg >= len(a) and end >= len(a): return []

# 如果方向不同,则返回空列表

if (end - beg) * delta <= 0: return []

# 将越界的部分进行裁剪

beg = max(0, min(beg, len(a) - 1))

end = max(-1, min(end, len(a)))

ans = []

i = beg

while between(beg, end, i):

ans.append(a[i])

i += delta

return ans

def set_slice(a, li, beg, end, delta=1):

if delta == 0: raise ValueError("slice step cannot be 0")

if delta == 1:

# 如果delta==1,那么li的长度可以随意

if beg < 0: beg += len(a)

if end < 0: end += len(a)

beg = max(0, min(beg, len(a) - 1))

end = max(-1, min(end, len(a)))

for i in range(beg, end):

del a[beg]

for i in reversed(li):

a.insert(beg, i)

else:

# delta!=1,相当于替换

if len(get_slice(a, beg, end, delta)) != len(li): raise ValueError("array don't match")

if len(li) == 0: return

if beg < 0: beg += len(a)

if end < 0: end += len(a)

beg = max(0, min(beg, len(a) - 1))

# 用li中的全部元素逐一替换

for ind, value in enumerate(li):

a[ind * delta + beg] = value

def test_getSlice():

a = list(range(10))

import random

for i in range(10):

beg = random.randint(-15, 15)

end = random.randint(-15, 15)

delta = 0

while delta == 0: delta = random.randint(-15, 15)

print(len(get_slice(a, beg, end, delta)) == len(a[beg:end:delta]), beg, end, delta)

def test_setSlice():

import random

for i in range(10):

a = list(range(10))

beg = random.randint(-15, 15)

end = random.randint(-15, 15)

delta = 0

while delta == 0: delta = random.randint(-5, 5)

sz = len(a[beg:end:delta])

if delta == 1: sz = random.randint(0, 4)

li = [random.randint(0, 100) for i in range(sz)]

set_slice(a, li, beg, end, delta)

mine = a

a = list(range(10))

a[beg:end:delta] = li

print(a == mine)

test_setSlice()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持聚米学院。

python list 实现原理,彻底理解Python list切片原理相关推荐

  1. python装饰器原理-深刻理解python装饰器

    我们要完全理解python装饰器,不是很容易,主要归结有如下困难: 1. 关于函数"变量"(或"变量"函数)的理解 2. 关于高阶函数的理解 3. 关于嵌套函数 ...

  2. python在线搭建教程_理解python web开发,轻松搭建web app!

    大家好,今天分享给大家的是理解python web开发,轻松搭建web app,希望大家学有所获! 因为 python代码的优雅美观且易于维护这一特点,越来越多的人选择使用 Python做web开发. ...

  3. python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递

    python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...

  4. python怎么导入包-如何理解Python中包的引入

    Python的from import *和from import *,它们的功能都是将包引入使用,但是它们是怎么执行的以及为什么使用这种语法呢? 从一模块导入全部功能 from import * me ...

  5. python语句解释_深入理解python with 语句

    深入理解python with 语句 python中with 语句作为try/finally 编码范式的一种替代, 适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的" ...

  6. python iterable对象_如何理解Python中的iterable对象

    转载请注明出处:https://www.jianshu.com/u/5e6f798c903a [^*] 表示注脚,在文末可以查看对应连接,但简书不支持该语法. 首先,容器和 iterable 间没有必 ...

  7. 为什么一个程序中变量只能定义一次_#带你学Python# 从简单程序出发理解Python基本语法

    欢迎回来. 通过上一篇文章,我们第一次触摸了Python,学会了如何用各种不同的方式运行Python的解释器.也介绍了很多工具和开发环境,是不是跃跃欲试了? 到这里,别的python教程就会从数据类型 ...

  8. python web什么意思_理解Python的Web开发

    因为python代码的优雅美观且易于维护这一特点,越来越多的人选择使用Python做Web开发.而Python的Web框架百花齐放,目前比较流行的框架有大包大揽的Django,小巧灵活的Flask.B ...

  9. python装饰器原理-深入理解 Python 装饰器

    作者简介 曾凡伟,携程信息安全部高级安全工程师,2015年加入携程,主要负责安全自动化产品的设计和研发,包括各类扫描器.漏洞管理平台.安全 SaaS 平台等. Python 是一门追求优雅编程的语言, ...

最新文章

  1. css中的垂直居中方法
  2. 仓库码放要求_货物码放规范
  3. 阿里云产品搭建web应用梳理
  4. 【专访】PP租车孙览江:与有梦想的人一拍即合,PM都有改变世界的小情怀
  5. OpenGL 几何着色器细分的实例
  6. Ansible-playbook 部署redis主从
  7. 2021 CCPC E. 被遗忘的计划(循环卷积+快速幂)
  8. Linux查看设置系统时区
  9. FFmpeg总结(一)FFmpeg官方文档分块
  10. SELinux系列(四)——SELinux配置文件(/etc/selinux/config)详解
  11. 酒桌上说话时的七大注意事项
  12. matlab图像拼接_FPGA大赛【四】具体模块设计图像缓存
  13. get请求是否 csrf认证流程_CORS和CSRF修炼宝典
  14. python设置窗体标题_Python3 tkinter基础 TK title 设置窗体的标题
  15. 首份《敏捷回顾年度报告》发布
  16. 童年的李子明都长大了,你还会去买一罐旺仔牛奶吗?
  17. 教你用微信带称呼群发祝福
  18. 直方图均衡化取整怎么计算_玩转直方图处理之直方图均衡化、规定化
  19. Python 爬虫问卷星填写
  20. axios get怎么还会显示跨域_axios 跨域问题的解决 (接口 Phal 框架)

热门文章

  1. 使用MATLAB绘制周期信号的,周期信号频域分析及MATLAB实现.ppt
  2. java高端架构_Java高端架构师
  3. mysql 柱状图统计_js/jquery 进行动态统计 各种柱状图 饼状图 线条图 等
  4. android微信支付回调方法,Android接入支付宝和微信支付的方法
  5. Ubuntu 禁用 触摸板
  6. UBUNTU下面安装ICE失败记录过程
  7. MyBatis框架学习笔记02:利用MyBatis实现CRUD操作
  8. Python学习笔记:模块与包
  9. Java讲课笔记14:final关键字
  10. Python案例:破译爬虫项目实践活动日期密码