一个非常好懂的列表知识点介绍内容纯纯大白话非常完善非常全面如果你想学习python列表的知识点只要认真的看完这一篇绝对能明白如果你现在有点忙那也不用担心收藏一下以后也能慢慢看哟~好了废话不多说我们开始学习吧→一、定义1、列表是序列的一种属于可变序列有序、可修改元素、允许重复元素。2.书写符号方括号[]元素用逗号隔开。3.元素可以是任意数据类型数字、字符串、列表、布尔值等支持嵌套x[] #空列表 x[1,2,3] x[[1,2],[3,4]] #嵌套列表二、列表的基本操作1.取索引值索引值其实就是列表内每个元素的编号首先假设一个列表x[apple,year,python,thank,new] #随机取五个元素每个列表元素对应的索引值如下列表中的元素appleyearpythonthanknew正向索引对应的索引值01234反向索引对应的索引值-5-4-3-2-1打印列表元素x[1,2,3,4,5,6] print(x[1]) #2 x[1,2,3,4,5,6] print(x[-5]) #22.切片x[start:end:step]-start列表切片范围开始元素的下表索引值闭区间-end列表切片范围结束元素的下表索引值开区间-step列表切片的步长x[1,2,3,4,5,6,7,8,9,10] print(x[0,5]) #[1,2,3,4,5] print(x[:5]) #[1,2,3,4,5] print(x[5:]) #[6,7,8,9,10] print(x[:]) #[1,2,3,4,5,6,7,8,9,10] print(::2) #[2,4,6,8,10] print(::-1) #[10,9,8,7,6,5,4,3,2,1]3.列表的运算x[1,2] y[3,4] print(xy) #[1,2,3,4] print(x*3) #[1,2,1,2,1,2] print(len(x)) #2len()表示获取列表x的长度和*都是生成一个新的列表而不是改动原列表三、列表独有的方法增、删、改1.增添加列表中的元素序号方法作用示例①x.append(元素)在列表末尾追加一个元素x[1,2] x.append(3) print(x) #[1,2,3]②x.extend(序列)把多个元素一起追加到末尾相比于append方法效率更高x[1,2] print(x.extend([3,4])) #[1,2,3,4] x[1,2] print(x.extend(ab)) #[1,2,a,b]③x.insert(index,元素)在指定的下表索引值位置插入元素x[1,3,4,5] print(x.insert(1,2)) #[1,2,3,4,5]2.删删除列表中的元素序号方法作用示例①x.pop(index)根据指定的下标索引值删除指定元素不标注下标索引值默认删除最后一项x[1,2,3,4] print(x.pop()) #[1,2,3] x[1,2,3,4] print(x.pop(2)) #[1,2,4]②x.remove(元素)删除与指定元素相同的第一个元素找不到指定元素就报错x[1,2,3,2,4] print(x.remove(2)) #[1,3,2,4] x[1,2,3,4] print(x.remove(5)) #报错③x.clear()删除方法中的“王炸”可以直接清空整个列表让其变成一个空列表[]x[1,2,3,4] print(x.clear()) #[]当然在列表中还有一个删除列表元素的技能del,因为它不是方法是一个关键字为了区别就不写在上面格子里了序号关键字作用示例①del x[]对于方括号内不同的内容具有不同的删除效果若没有方括号视为直接删除整个列表x[1,2,3,4,5] del x[2] #删除下表索引值为2的元素结果为[1,2,4,5] x[1,2,3,4,5] del x[2:] #利用切片的方法删除列表中的元素结果为[1,2] x[1,2,3,4,5] del x #直接删除整个列表比clear方法更彻底直接将x这个列表变量删除3.改修改列表中的元素改的技巧中都没有用到方法主要是索引赋值和切片赋值两种方式序号方式作用示例①x[索引值]赋值利用下标索引值进行赋值来修改列表中的元素x[1,2,3,4,5] x[2]7 print(x) #[1,2,7,4,5]②x[切片][新列表]利用切片方法将列表中的多个元素同时修改x[1,2,3,4] x[1:3][a,b] print(x) #[1,a,b,4] x[1,2,3,4] x[1:][5,6] print(x) #[1,5,6]四、其他方法1.查查找列表中的元素序号方法作用示例①x.index(元素)返回指定元素第一次出现的位置的索引值若列表中不存在该指定元素则报错x[1,2,3,4,5] print(x.index(3)) #2 x[1,2,3,4,5] print(x.index(7)) #报错②x.count(元素)统计该指定元素在列表中出现的次数x[1,2,2,3,4] print(x.count(2)) #2 x[1,2,3,4] print(x.count(5)) #02.列表的排序和反转序号方法作用示例①x.sort()原地排序直接修改原列表返回值None默认升序降序需要将括号内的内容修改为reverseTruex[1,3,2,4] print(x.sort()) #[1,2,3,4] x[1,3,2,4] print(x.sort(reverseTrue)) #[4,2,3,1] #实际上reverseTrue就是让整个列表反转②sorted(x)不改变原数据返回一个新列表与sort方法的区别就在于一个是改变原列表一个是返回新列表。x[1,3,2,4] ysorted(x) print(y) #[1,2,3,4] x[1,3,2,4] ysorted(x,reverseTrue) print(y) #[4,2,3,1]③x.reverse()将整的原列表反转修改原列表x[1,2,3,4] print(x.reverse()) #[4,3,2,1]还有一种是利用切片的方法进行列表的反转序号方式作用示例①x[::-1]将原列表进行反转生成一个新列表x[1,3,2,4] yx[::-1] print(y) #[4,2,3,1]3.列表推导式快速生成列表利用for循环和分支结构来和条件相结合生成一个简洁的推导式来生成列表。①基础列表推导式[表达式 for 变量 in 可迭代对象]我们比较一下原本的列表生成方式和利用列表推导式生成列表之间的代码差距。传统for循环写法x[] for i in range(10): x.append(i) print(x) #[0,1,2,3,4,5,6,7,8,9]列表推导式写法x[i for i in range(10)] print(x) #[0,1,2,3,4,5,6,7,8,9]相比较之下还是简单很多的。②带if条件筛选的列表推导式[表达式 for 变量 in 序列 if 判断条件]只会保存if条件后面为True的元素执行顺序for 循环遍历 → if 条件判断 → 条件成立才执行表达式并加入列表输入一个列表列表的元素都是0-20之间的偶数 x[i for i in range(0,21) if i%20] print(i) #[0,2,4,6,8,10,12,14,16,18,20]③多重for循环的列表推导式[表达式 for 变量1 in 序列1 for 变量2 in 序列2]传统多重for循环写法生成一个九九乘法表 x[] for i in range(1,10): y[] for j in range(1,i1): sf{j}*{i}{i*j} y.append(s) x.append(y) for row in x: print(row) #[1*11] [1*22, 2*24] [1*33, 2*36, 3*39] [1*44, 2*48, 3*412, 4*416] [1*55, 2*510, 3*515, 4*520, 5*525] [1*66, 2*612, 3*618, 4*624, 5*630, 6*636] [1*77, 2*714, 3*721, 4*728, 5*735, 6*742, 7*749] [1*88, 2*816, 3*824, 4*832, 5*840, 6*848, 7*856, 8*864] [1*99, 2*918, 3*927, 4*936, 5*945, 6*954, 7*963, 8*972, 9*981]列表推导式写法x[f{i}*{j}{i*j}for i in range(1,10) for j in range(1,1i)] print(x) #[1*11, 2*12, 2*24, 3*13, 3*26, 3*39, 4*14, 4*28, 4*312, 4*416, 5*15, 5*210, 5*315, 5*420, 5*525, 6*16, 6*212, 6*318, 6*424, 6*530, 6*636, 7*17, 7*214, 7*321, 7*428, 7*535, 7*642, 7*749, 8*18, 8*216, 8*324, 8*432, 8*540, 8*648, 8*756, 8*864, 9*19, 9*218, 9*327, 9*436, 9*545, 9*654, 9*763, 9*872, 9*981]虽然写出来比较不美观但还是比传统的多重for循环写法要简洁得多。④if…else 三元表达推导式[值1 if 条件 else 值2 for 变量 in 序列]举个简单的例子偶数保留原数奇数替换为 0 x[1,2,3,4,5] y[i if i % 2 0 else 0 for i in x] print(y) #[0, 2, 0, 4, 0]⑤小结总而言之列表推导式就是将繁琐的列表生成方式以更高级、更简洁的方式表达出来不过还是不要过于追求列表推导式代替传统书写方式因为编程代码主要是体现得越简洁越好。当然列表推导式远不止于以上这几种还有更多for循环和分支结构的搭配方式操作者们可以根据自己的需求自由寻找搭配方式。4.列表的拷贝①拷贝的基础定义首先我们要区分拷贝和赋值这两个定义我们先举个例子来看看什么是赋值a[1,2,3,4] ba print(id(a)) #2549252989760 print(id(b)) #2549252989760我们用id()函数很容易就发现列表a和b的地址是相同的这就说明a和b是同一个列表如果我们改动a列表里面的元素再打印b列表a.append(5) print(b) #[1,2,3,4,5]会清晰地发现b列表的元素也一起改变了说明a和b列表只是一个列表的两个不同称号。与赋值不同的拷贝则是生成一个不同地址的新列表新拷贝的列表不随原列表的改变而改变接下来我们来看看拷贝是如何操作的。②浅拷贝浅拷贝顾名思义就是拷取浅层的列表那么什么是浅层列表嘿嘿不用着急咱们先学一下浅拷贝的几种实现方式。序号方式作用示例①list(x)把可迭代对象转化成全新列表我们这里主要的可迭代对象默认为是列表x[1,2,3,4] ylist(x) print(y) #[1,2,3,4]②x[:]利用切片的方式拷贝原列表x[1,2,3,4] yx[:] print(y) #[1,2,3,4]③x.copy()利用列表copy()方法拷贝列表x[1,2,3,4] yx.copy() print(y) #[1,2,3,4]④copy.copy(x)利用copy模块的copy()函数,拷贝列表import copy x[1,2,3,4] ycopy.copy(x) print(y) #[1,2,3,4]很明显有了浅拷贝那当然对应的就有深拷贝。③深拷贝聪明的你肯定发现用浅拷贝的方法有很大的局限性比如改动新列表查看原列表是否被改动 x[1,2,[3,4]] yx.copy y[0]50 print(x) #[1,2,[3,4]] x[1,2[3,4]] yx.copy y[2][0]520 print(x) #[1,2,[520,4]]由此可以看出我们利用浅拷贝的方式获取的新列表外层和原列表是不同地址的但内层嵌套列表依旧和原列表的内层嵌套列表是同一地址因此原列表会随新列表内层嵌套列表的改动而改动。所以我们不难看出浅拷贝就是拷取列表的外层元素相对的接下来的深拷贝则是彻彻底底的改变整个列表。序号方法作用示例①copy.deepcopy(x)copy模块的另一个函数深拷贝原列表import copy x[1,2,[3,4]] ycopy.deepcopy(x) print(y) #[1,2,[3,4]]那么很多人就要问了竟然深拷贝这么好用完全不会出错那为何不全部都用深拷贝呢那是因为“一个物体强那就要为变强付出代价”深拷贝会消耗更多内存与时间所以复杂大数据要谨慎使用。5.列表的常用转换列表和其他序列之间存在着类型的相互转换学会转换的方法让你能轻松自如地转换序列类型。①其他序列类型→列表序号转换的类型方法示例①元组→列表list(x)x(1,2,3) ylist(x) print(y) #[1,2,3]②字符串→列表list(x)xhello ylist(x) print(y) #[h,e,l,l,o]③range对象→列表list(x)xrange(1,6) ylist(x) print(y) #[1,2,3,4,5]④集合→列表list(x)x{1,2,3} ylist(x) print(y) #[1,2,3]②列表→其他序列类型序号转换的类型方法示例①列表→元组tuple(x)x[1,2,3] ytuple(x) print(y) #(1,2,3)②列表→集合set(x)x[1,2,3] yset(x) print(y) #{2,1,3}无序性③列表→字符串str(x)x[1,2,3] ystr(x) print(y) #[1,2,3]④列表→利用拼接符形成纯文本分隔符.join(x)前提是列表内所有元素都是字符串 x[a,b,c] y.join(x) print(y) #abc⑤列表→range对象range(len())x[0,1,2,3,4,5] yrange(len(x)) print(y) #range(0,6)五、尾声好啦~看完这些知识点是不是觉得非常的通透感觉已经完全掌握了列表的所有知识点。不妨亲自敲一敲代码感受一下列表的实用之处。如果忘记怎么用了欢迎回来再次查看这些知识点最后感谢大家的关注和支持我还会继续发送更多知识和干货如果本文章有什么错误之处和不妥之处欢迎大家指正我会立即改正错误如果有什么要补充的也非常欢迎提供