列表是常用的数据类型,可以对数据进行存储和修改。
定义列表
1 >>> list_test = ['boduo','xiaoze','canglaoshi','jize','wutenglan']
打印输出列表
1 >>> print(list_test) 2 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'wutenglan']
通过下标访问列表中的元素,列表元素下标从0开始
1 >>> list_test[0] 2 'boduo' 3 >>> list_test[3] 4 'jize' 5 >>> list_test[-1] #还能倒着取 6 'wutenglan' 7 >>> list_test[6] #当输入下标大于当前列表元素最大下标时,会报错 8 Traceback (most recent call last): 9 File "<pyshell#16>", line 1, in <module> 10 list_test[6] #当输入下标大于当前列表元素最大下标时,会报错 11 IndexError: list index out of range 12 >>>
切片:切取多个元素
刚开始接触Python列表切片觉得很神奇,也很灵活,下面直接从使用规律总结一些经验
1 list_test = ['boduo','xiaoze','canglaoshi','jize','wutenglan'] 2 3 print (list_test[0:3]) #截取第一位到第三位的字符 4 print (list_test[:]) #截取字符串的全部字符 5 print (list_test[2:]) #截取第二个字符到结尾 6 print (list_test[:3]) #截取从开头到第三个字符 7 print (list_test[:-3]) #截取从头开始到倒数第三个字符之前 8 print (list_test[2]) #截取第三个字符 9 print (list_test[-1]) #截取倒数第一个字符 10 print (list_test[::-1]) #创造一个与原字符串顺序相反的字符串 11 print (list_test[-3:-1]) #截取倒数第三位与倒数第一位之前的字符 12 print (list_test[-3:]) #截取倒数第三位到结尾 13 print (list_test[:-4:-2]) #逆序截取
1、可见,列表有三个参数的下标有三个参数:beg(起始下标),end(终止下标), step(步长值)
当 step小于0时,beg默认为len(array)-1,end默认为开头之前。( 补充:此时,beg必须大于end才有结果,否则为空。)
当 step大于0时,beg默认为0,end默认为最末之后。(补充:此时,beg必须小于end才有结果,否则为空。)
2、可见,关于list_test[0:3]切片实际取值列表元素下标范围为0<=x<3,所以才会有截取第一为到第三位的字符,既列表元素下标为0,1,2的。
3、需要注意的是,列表切片产生的是列表的副本,与原列表不是同一份空间。
1 >>> list_test = ['boduo','xiaoze','canglaoshi','jize','wutenglan'] 2 >>> list_sub = list_test[1,3] #注意这里的切片使用的是(:冒号)而不是(,逗号)自己懵逼了 3 Traceback (most recent call last): 4 File "<pyshell#85>", line 1, in <module> 5 list_sub = list_test[1,3] #注意这里的切片使用的是(:冒号)而不是(,逗号)自己懵逼了 6 TypeError: list indices must be integers or slices, not tuple 7 >>> list_sub = list_test[1:3] 8 >>> list_sub 9 ['xiaoze', 'canglaoshi'] 10 >>>
4、钻牛角尖问题(个人感觉这个问题可能钻牛角尖了,过段时间再回看,也请观看的博友能指导下,不胜感激):
关于下面负索引切片该怎么理解呢
为什么第2行第4行输出的结果一样,但是到了第6行第8行就不一样了呢
1 >>> list_test = ['boduo','xiaoze','canglaoshi','jize','wutenglan'] 2 >>> print (list_test[:]) 3 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'wutenglan'] 4 >>> print (list_test[-5:]) 5 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'wutenglan'] 6 >>> print (list_test[::-1]) 7 ['wutenglan', 'jize', 'canglaoshi', 'xiaoze', 'boduo'] 8 >>> print (list_test[-5::-1]) 9 ['boduo'] 10 >>>
答案:关于这个(坑爹的)问题我查找了资料已经解决了,这里主要因为步长值对列表切片默认的开始值结束值造成的影响。
list[beg:end:step]
若 step > 0, 则表示从左向右进行切片。此时,beg必须小于end才有结果,否则为空。
若 step < 0, 则表示从右向左进行切片。 此时,beg必须大于end才有结果,否则为空。
比如上面代码处第8行,当step(步长值)小 于0,此时列表切片的默认值为beg=-1,end=-5;但是由于我把beg设成-5,导致只能捕获到一个元素。
所以这就是print(list_test[-5:])与print(list_test[-5::-1])的区别。
追加:
1 >>> list_test = ['boduo','xiaoze','canglaoshi','jize','wutenglan'] 2 >>> list_test.append('woshixinlaide') 3 >>> list_test 4 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'wutenglan', 'woshixinlaide'] 5 >>> list_test2=['woshixinlaide2','woshixinlaide3'] 6 >>> list_test.append(list_test2) 7 >>> list_test 8 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'wutenglan', 'woshixinlaide', ['woshixinlaide2', 'woshixinlaide3']] 9 >>>
1、这里面需要注意的是第5行第6行,定义一个列表list_test2使用.append追加到list_test中,list_test2列表在list_test中被视为一个元素。
插入:
1 >>> list_test = ['boduo','xiaoze','canglaoshi','jize','wutenglan'] 2 >>> list_test 3 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'wutenglan'] 4 >>> list_test.insert(2,'我是新来的') 5 >>> list_test 6 ['boduo', 'xiaoze', '我是新来的', 'canglaoshi', 'jize', 'wutenglan'] 7 >>> list_test2 8 ['woshixinlaide2', 'woshixinlaide3'] 9 >>> list_test.insert(2,list_test2) 10 >>> list_test 11 ['boduo', 'xiaoze', ['woshixinlaide2', 'woshixinlaide3'], '我是新来的', 'canglaoshi', 'jize', 'wutenglan'] 12 >>> list_test[2] 13 ['woshixinlaide2', 'woshixinlaide3']
1、观察第13行,往列表中插入的对象都视为目标列表中的一个元素
修改:
1 >>> list_test 2 ['boduo', 'xiaoze', ['woshixinlaide2', 'woshixinlaide3'], '我是新来的', 'canglaoshi', 'jize', 'wutenglan'] 3 >>> list_test[2] 4 ['woshixinlaide2', 'woshixinlaide3'] 5 >>> list_test[3] 6 '我是新来的' 7 >>> list_test[3] = '我已经来了很久了' 8 >>> list_test 9 ['boduo', 'xiaoze', ['woshixinlaide2', 'woshixinlaide3'], '我已经来了很久了', 'canglaoshi', 'jize', 'wutenglan'] 10 >>>
删除:
1 >>> list_test 2 ['boduo', 'xiaoze', ['woshixinlaide2', 'woshixinlaide3'], '我已经来了很久了', 'canglaoshi', 'jize', 'wutenglan'] 3 >>> del list_test[2] #删除指定下标的元素 4 >>> list_test 5 ['boduo', 'xiaoze', '我已经来了很久了', 'canglaoshi', 'jize', 'wutenglan'] 6 >>> list_test.remove('我已经来了很久了') #删除指定元素 7 >>> list_test 8 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'wutenglan'] 9 >>> list_test.pop() #删除列表最后一个元素,并返回该元素 10 'wutenglan' 11 >>> list_test 12 ['boduo', 'xiaoze', 'canglaoshi', 'jize'] 13 >>>
扩展:
1 >>> list_test2 2 ['woshixinlaide2', 'woshixinlaide3'] 3 >>> list_test 4 ['boduo', 'xiaoze', 'canglaoshi', 'jize'] 5 >>> list_test.extend(list_test2) 6 >>> list_test 7 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'woshixinlaide2', 'woshixinlaide3'] 8 >>> list_test.extend('xiaoze') #注意这个特例 9 >>> list_test 10 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'woshixinlaide2', 'woshixinlaide3', 'x', 'i', 'a', 'o', 'z', 'e'] 11 >>> list_test3 = [['C331',['C332','C333']],['B221','B222'],'A111'] #新建立多级嵌套列表 12 >>> list_test 13 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'woshixinlaide2', 'woshixinlaide3', 'x', 'i', 'a', 'o', 'z', 'e'] 14 >>> list_test.extend(list_test3) 15 >>> list_test 16 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'woshixinlaide2', 'woshixinlaide3', 'x', 'i', 'a', 'o', 'z', 'e', ['C331', ['C332', 'C333']], ['B221', 'B222'], 'A111'] 17 >>>
1、扩展列表list_test,注意list_test2也是一个列表,但使用extend扩展后,列表list_test2中的元素变成列表list_test中的元素
2、观察第8行特例,当插入一个字符串时,会拆成单个字母
3、观察第11行的列表list_test3结构并与第16行扩展到列表list_test的结构
4、可看出,使用列表扩展时会对添扩展内容进行一次细化切片,但只切取一次
拷贝:
查看下列网址:
https://www.cnblogs.com/king-of-purple/p/9420486.html
统计:
1 >>> list_test 2 ['boduo', 'xiaoze', 'canglaoshi', 'jize', 'woshixinlaide2', 'woshixinlaide3', 'x', 'i', 'a', 'o', 'z', 'e', ['C331', ['C332', 'C333']], ['B221', 'B222'], 'A111'] 3 >>> list_test.count('x') 4 1 5 >>>
排序&翻转:
1 >>> list_test4 = ['xiaoze','canglaoshi',11,22,33] 2 >>> list_test4.sort() #3.0开始Python不支持不用类型数据的排序 3 Traceback (most recent call last): 4 File "<pyshell#162>", line 1, in <module> 5 list_test4.sort() 6 TypeError: unorderable types: int() < str() 7 >>> list_test4[2] = '33' 8 >>> list_test4[3]='11' 9 >>> list_test4[4]='22' 10 >>> list_test4 11 ['xiaoze', 'canglaoshi', '33', '11', '22'] 12 >>> list_test4.sort() 13 >>> list_test4 14 ['11', '22', '33', 'canglaoshi', 'xiaoze'] 15 >>> list_test4.reverse() #翻转 16 >>> list_test4 17 ['xiaoze', 'canglaoshi', '33', '22', '11'] 18 >>>
获取下标:
1 >>> list_test4 2 ['xiaoze', 'canglaoshi', '33', '22', '11'] 3 >>> list_test4.index('xiaoze') #获取指定元素的下标 4 0 5 >>>