第3.3节 强大的Python列表
一、 列表切片操作补充
列表切片支持所有序列切片的方法,以倒序切片和步长大于1的情况再举例验证一下:

l=[1,2,3,4,5]
l[::2] #结果[1, 3, 5]
l[-1::2] #结果[5]
l[-1::-2] #结果[5, 3, 1]
其他序列已有的切片方法在列表中同样适用,这里就不举例说明了。通过切片赋值:当给切片赋值为与切片个数相同的元素数量的列表时,实际上就是将切片指定的元素替换为新列表的内容。举例:

c=[1,2,3,‘a1178’,‘b210’,‘c3112’]
c[2:5]=[100,200,‘abcdefg’] #执行结果为c=[1, 2, 100, 200, ‘abcdefg’, ‘c3112’]通过切片插入给定列表中的值到原列表中指定位置,具体位置通过切片起始索引指定,此时两个索引值应该相等

c=[1,2,3,‘a1178’,‘b210’,‘c3112’]
c[2:2]=[‘ABC’,‘123’,‘E456’] #执行完毕后, c=[1, 2, ‘ABC’, ‘123’, ‘E456’, 3, ‘a1178’, ‘b210’, ‘c3112’]通过切片更新和同时插入元素:上面两点讲了切片元素替换和插入,如果赋值语句右边的列表长度长于切片的起始位置包含的元素个数,是否会导致切片段的元素被替换,多余的被插入?

c=[1,2,3,‘a1178’,‘b210’,‘c3112’]
c[2:4]=[100,200,300,400] # c =[1, 2, 100, 200, 300, 400, ‘b210’, ‘c3112’],确实是切片部分被替换,多出切片部分的新元素插入如果列表元素个数少于切片包含的元素个数呢?我们来看实际例子:

c=[1,2,3,‘a1178’,‘b210’,‘c3112’]
c[2:5]=[100,200] #c=[1, 2, 100, 200, ‘c3112’],切片超过赋值列表的部分被删除了删除列表的元素:通过上面的例子,我们发现切片还可以删除元素,那整个列表清空也可以通过切片操作,其语法是c[:]=[],类似于clear的效果。
如果切片时带步长不等于1又会什么效果?具体在这里不讲解了,举例如下:

c=[1,2,3,‘a1178’,‘b210’,‘c3112’]
c[::2]=[] #报错,3个元素的切片不能赋值为空序列
c[::2]=[‘A’,‘B’,‘C’] #正常执行,替换1、3、5三个元素,结果[‘A’, 2, ‘B’, ‘a1178’, ‘C’, ‘c3112’],很神奇吧?
c[::2]=[‘A’,‘B’,‘C’,‘D’,‘E’]#报错,3个元素的切片不能赋值为大小为5的序列
c[::2]=[‘A1’,‘B1’]#报错,3个元素的切片不能赋值为大小为2的序列
从以上试验可以看出,只有当用于替换的列表的元素个数与被替换的切片元素个数相等时才会允许步长不等于1切片赋值操作
以上详细介绍了列表的切片的进一步操作,还有其他的操作方法,如怎么把extend用切片方式实现,怎么用切片复制一个列表,大家可以自己想想和试验一下,在此不再详细介绍。总体来说,切片让序列和列表很神奇很灵活,但在本阶段知识下的老猿认为实际在程序开发中利用起来的场景应该不多,不知道随着进一步的学习是否有变化。
二、 列表的其他操作
序列的拼接、相乘在列表中同样支持,举例如下:

l1=l+l #执行结果 l1为[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
l2=l*3 #执行结果 l2为[1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]in这个方法在序列中就存在,前面介绍序列时没有介绍,在这以列表补充说明一下。
语法:元素 in 列表,返回True或False的布尔值

ls = [‘abc’,‘a1’,‘b2’,‘c3’]
‘abc’ in ls #返回结果True
字符串的使用方法类似,字典中使用有些不同,在字典章节再详细介绍。max、min、len在列表中同样可以使用,但max、min要求列表的元素必须是纯数字或纯字符串的,不能支持数字和字符串的混合,但支持列表的元素还是列表,且每个子列表的元素都是数字或者都是字符串(多个子列表的元素类型必须相同),看看下面的例子

n=[1,2,3]
c=[‘a’,‘ba’,‘c1’]
max(n),max #执行结果(3, ‘c1’)
l = n+c #执行结果[1, 2, 3, ‘a’, ‘ba’, ‘c1’]
max(l)报错:
Traceback (most recent call last):
File “<pyshell#6>”, line 1, in
max(l)
TypeError: ‘>’ not supported between instances of ‘str’ and ‘int’
l=[n]+[n] #执行结果 l=[[1, 2, 3], [1, 2, 3]],注意列表元素还是列表
max(l) #执行结果为[1, 2, 3]
l=[c]+[c] #执行结果为 l=[[‘a’, ‘ba’, ‘c1’], [‘a’, ‘ba’, ‘c1’]]
max(l) #执行结果为[‘a’, ‘ba’, ‘c1’]
l=[n]+[c]#执行结果为l=[[1, 2, 3],[‘a’, ‘ba’, ‘c1’]]
max(l)报错:
Traceback (most recent call last):
File “<pyshell#15>”, line 1, in
max(l)
TypeError: ‘>’ not supported between instances of ‘str’ and ‘int’coun方法是列表的方法,用于计算指定元素在列表中出现的次数,该方法还可以用于字符串和元组,但不能用于字典类型;
reverse是列表方法,该方法用于将列表中的元素反序排列,并不返回任何值,但并不表示列表中的元素是按降序排列。
l=[1,3,5,7,6]
l.reverse() #执行结果l= [6, 7, 5, 3, 1]sort是列表方法,可以对列表元素进行排序(包括升序和降序),如果要降序排列,需要指定reverse=True,该方法并不返回任何值。
l=[1,3,5,7,6]
l.sort() #执行结果l=[1, 3, 5, 6, 7]
l.sort(reverse=1) #执行结果l=[7, 6, 5, 3, 1]sort列表方法还可以指定排序的方法,缺省是按字母顺序,也可以按指定处理方法处理的结果来比较,实际上就是将列表的元素通过一个函数进行hash得到的键值进行比较,具体函数通过参数key来指定,如指定len函数作为处理方法,则是将所有列表元素计算长度后,再按长度进行排序。如:

s = [‘123’,‘abc’,‘1234’,‘abcd’,‘01234’,‘ABC’]
s.sort(key=len) #执行结果s=[‘123’, ‘abc’, ‘ABC’, ‘1234’, ‘abcd’, ‘01234’]函数sorted, 函数的参数可以是任何序列,返回一个排序的列表,参数对应的序列没有变化,与列表方法sort相同,可以指定reverse来确认是升序还是降序。如:
sorted(l,reverse=True)
s =‘1231234’
sorted(s) #返回列表[‘1’, ‘1’, ‘2’, ‘2’, ‘3’, ‘3’, ‘4’],s保持不变
三、 列表的复制
列表的复制涉及内容比较多,因此单列一个段,是将一个列表变量的元素复制到一个新列表中,但两个列表不是同一个对象。先介绍方法:
用copy方法,语法为:新列表=老列表.copy();
用切片方法,语法为:新列表=老列表[:];
用list方法,语法为:新列表=list(老列表).
注意,以上的复制方法都是浅复制,什么是浅复制?就是复制时,只是完全复制了第一层元素,但第一层元素如果有嵌套的对象(如列表、元组、字典等)时,其指向的下一次对象只是复制了指向,被没有复制内容。下面来看案例:

l=[‘abc’,[1,2,3]]
l1,l2,l3,l4=l,l.copy(),l[:],list(l) #执行后4个新列表值完全与l一致,别忘了前面第三节(第二章 Python编程基础知识)介绍的“一次给多个变量赋值”操作方法。
l1,l2,l3,l4 #显示4个列表内容,都是([‘abc’, [1, 2, 3]]
l is l1 #判断两个对象是否是一个对象,结果为True
l is l2 #结果为False
l is l3 #结果为False
l is l4 #结果为Falsel[0]=‘ABCD’ #修改列表l的第一个元素值
l[1][0]=100 #修改列表第二个元素嵌套的子列表的第一个元素的值l #经过修改后l的值变为[‘ABCD’, [100, 2, 3]]
l1,l2,l3,l4 #显示4个列表内容,分别是([‘ABCD’, [100, 2, 3]], [‘abc’, [100, 2, 3]], [‘abc’, [100, 2, 3]], [‘abc’, [100, 2, 3]])
从上述执行结果可以看出,由于l和l1是同一对象,对l的所有赋值都会反映到l1,而l2、l3、l4都是浅复制,因此对于l字符串元素的修改都不会影响到它们,但对嵌套子列表的修改会影响到这三个。
关于浅复制,有点类似于c语言的指针数组,浅复制只是将原数组的指向地址复制了一份到新数组,但复制的数组与原数组都存储了各个指针的指向地址,但指针指向内容发生变化时,原始数组指向和新数组指向地址没变,但该地址存储的内容发生了变化,新老数组都可以访问到新的内容。
有浅复制就有深度复制,具体内容后面再讲。
本节继上节之后,对列表的操作方法进一步进行了讲解,列表的功能很强大,大家多练习一下。在这里特别说明一下,老猿所说的方法都是指某类对象的操作方法,属于对象或类所有,函数则是不属于对象和类的通用函数。
老猿Python系列文章用于逐步介绍老猿学习Python后总结的学习经验,这些经验有助于没有接触过Python的程序员可以很容易地进入Python的世界。该系列文章同步发表于:
http://blog.sina.com.cn/learnpython
http://laoyuanpython.lofter.com/
https://me.csdn.net/LaoYuanPython
欢迎大家批评指正,谢谢大家关注!
第3.3节 强大的Python列表的更多相关文章
- 第3.2节 Python列表简介
鉴于Python中列表(list)的强大功能,本节及后面至少有一节都是介绍列表相关的知识,本节先介绍基本的列表知识. 一. 列表的定义 列表是一种可以修改的序列,它有点类似于c语言中的数组,在Pyth ...
- python 列表生成器
python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...
- Python列表生成器
本篇将介绍python生成器,更多内容请参考:python学习指南 前言 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不 ...
- [python01] python列表,元组对比Erlang的区别总结
数据结构是通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字,字符,甚至可以是其他的数据结构. python最基本的数据结构是sequence(序列):6种内建的序列:列表,元组,字符串, ...
- Python列表推导式和嵌套的列表推导式
列表推导式提供了一个更简单的创建列表的方法.常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表,或者通过满足某些特定条件元素来创建子序列. 例如,假设我们想创建一个平方 ...
- Python列表操作大全(非常全)
Python列表操作大全(非常全!!!) 对于python列表的理解可以和C语言里面的数组进行比较性的记忆与对照,它们比较相似,对于python里面列表的定义可以直接用方括号里加所包含对象的方法,并且 ...
- Python—列表(一个“打了激素”的数组)
我们在C语言中会使用数组来将一大堆数据类型一样的数据挨个摆在一起,但是数组有一个基本的要求,就是数据类型必须是一致的,我们知道Python的变量由于没有数据类型,也就是说Python没有数组这一概念, ...
- (转)python 列表与元组的操作简介
python 列表与元组的操作简介 原文:https://www.cnblogs.com/QG-whz/p/4782809.html 阅读目录 列表 list函数 列表的基本操作 列表方法 元组 tu ...
- python 列表、元组 详解
python中有6种序列的内置类型,分别为:列表,元组,字符串,Unicode字符串,buffer对象和xrange对象 列表和元组是最常见两种类型. 下面将以列表(list)和元组(tuple)为例 ...
随机推荐
- Spring Security 实战干货:OAuth2第三方授权初体验
1. 前言 Spring Security实战干货系列 现在很多项目都有第三方登录或者第三方授权的需求,而最成熟的方案就是OAuth2.0授权协议.Spring Security也整合了OAuth2. ...
- leetcode132:4sum
题目描述 给出一个有n个元素的数组S,S中是否有元素a,b,c和d满足a+b+c+d=目标值?找出数组S中所有满足条件的四元组. 注意: 四元组(a.b.c.d)中的元素必须按非降序排列.(即a≤b≤ ...
- python_sys.argv的使用
# sys.argv练习 # 写一个python脚本,在cmd里执行 # python xxx.py 用户名 密码 cp 文件路径 目的地址 # python xxx.py alex sb cp D: ...
- excel导出csv包括逗号等的处理
/** * @Title: trimRubbishChar * @Description: 导出的时候需要对一格的内容进行检查,看是否有非法字符,以免串行 * @Since: 2016年8月2日 下午 ...
- 某C++神作,就100句话而已
假设p是指针,当delete p;时,后面一定要p=NULL将p指向空 cin cout cerr 都是iostream类型的对象.cout<<"hello world" ...
- Git-commit与回滚
# 提交-信息 git commit -m "message" git commit -a -m "message" // 等同于 git add . & ...
- Blazor入手教程(一)前言
Blazor入手教程(一)前言 结论 最近在学习blazor.得出了这么一个结论: Blazor是一门很值得学习的技术,未来.net下将会有相当多的 web应用使用blazor开发.十分看好这一技术, ...
- tp5 上传视频方法
控制器调用 /** * 视频上传 */ public function video_add(){ if (request()->isPost()){ $video = $_FILES['vide ...
- 看看吧!月薪20K以上的程序员才能全部掌握RabbitMq知识,你掌握了多少
一.RabbitMq基础知识 0.概述 消息队列的作用就是接收消息生产者的消息,然后将消息发送到消费者 1.信道channel 我的理解是生产者/消费者和rabbitmq交互的一个通道,负责交换机.队 ...
- FL Studio通道预设之采样预览
FL Studio采样预览栏在采样设置窗口的最底端,它能很好地显示 出载入采样的波形也可以将波形显示改为频谱显示.它里面显示出的是经过预处理效果栏处理后的波形或频谱图.我们在波形显示器下面还可以看到波 ...