本文章将作为博主对Python学习从基础开始的笔记与整理,也将自己的某些针对Python的理解分享出来有便于跟博主一样的大学新手一起学习和理解Python。
本文将详细的介绍列表(List)以及常用的函数等。
目录
什么是列表(List)
列表是有序的数据集合
在之前的字符串篇幅我们学到过字符串(string)是有序的字符序列,这两个都是有序的,但字符串我们学到了是不可变的,而在这里列表我们将要学到是可变的。
列表的结构:[] 列表由一对方括号表示。
列表中可以存储字符串,数字,布尔类型,列表等类型,不同类型的值是可以放在一个列表中的。
那么列表为什么是可变的?
因为在列表中储存的并不是具体值,而是每个值对应的id -> 和字符串不同,在列表的标号的每个内存空间通过内部储存的id指向具体值,只要改变id就可以储存不同的值。
在后面的代码中会展现列表的可变是怎么体现的。
创建列表
1.直接创造:我们可以直接构造一个列表,如:list_1 = ['a', 'b', 'c']
大部分的时候我们可以直接创建一个空列表list_1=[]支持后面的操作
list_1 = ['xiao', 'a', '12', [2]]
print(f'list_1: {list_1}')
print(f'list_1长度: {len(list_1)}')
2.list()函数
参数可以是空,或者是可迭代的-> 可迭代指内容是可以一个一个获取的
print(f'创建列表:{list()}')
print(f'创建列表:{list("abcd1234")}')
迭代列表
我们可以将for循环使用在列表上就可以遍历列表中的所有元素。
list_1 = ['xiao', 'a', '12', [2]]
for i in list_1:
print(i)
添加元素
列表是可变的,因此就衍生出了增删改查(CPRD)的操作来对列表进行操作。
1.append -> 追加,将元素增加到列表的末尾,一次只能增加一个元素
list_1 = ['xiao', 'a', '12', [2]]
list_1.append(90)
print(f'append后的列表:{list_1}')
可以看见我们现在的代码中我们打印的是list_1,但内容是更改后的内容,这就是因为列表是可变的。那我们对比一下不可变的字符串:
name = 'xIAO'
print(f'首字母大写:{name.capitalize()}')
print(name)#-->证明字符串不可变
在字符串中name本身没有改变,而是将新的操作后的字符串赋予了一个新的id打印。
2.extend -> 针对可以迭代的对象,会将参数循环以后依次追加到后面
list_1 = ['xiao', 'a', '12', [2]]
list_1.append([90, "哈哈"])
print(f'append后的列表:{list_1}')
list_1.extend([90, "哈哈"])
print(f'extend后的列表:{list_1}')
从上面代码的对比中应该能更好的理解迭代后依次追加的意思了吧。append只会将元素直接添加,而extend会将可迭代的元素如字符串,列表等迭代为单个元素后依次添加在末尾。
3.insert -> 添加到指定位置,将原本指定位置的元素一次往后移
insert(指定位置,添加内容)
list_1.insert(1, "哈哈")
print(f'insert后的列表:{list_1}')
可以看到原本的[1]号的内容变成了’哈哈‘,后面的元素依次往后移了一位。
删除元素
1.pop(index),参数可以省略,默认删除栈顶(末尾)的元素
list_1 = ['xiao', 'a', '12', [2]]
list_1.pop(1)
print(f'pop后的列表:{list_1}')
2.remove() 移除指定元素,注意元素不存在会报错
list_1 = ['xiao', 'a', '12', [2]]
list_1.remove('a')
print(f'remove后的列表:{list_1}')
使用remove的时候要千万小心:列表循环迭代中使用remove可能会导致无法完全删除的问题。
list_2 = ['aaa', 'bbb', 'ccc', 'ddd']
for i in list_2:
list_2.remove(i)
print(f'最终列表:{list_2}')
正常来讲我们迭代应该删除了所有元素对吧,但是很显然此时在循环中出现了问题,让我们来分析一下:
当列表删除元素后,列表的结构产生了改变,此时原本的[0]号被删除,原本的[1]:bbb变成了新的[0],后面的元素也依次向前一位。同时接下来,循环的游标将指向下一位置,选择了新的[1]也就是原本的[2]:ccc。 删除后结构又发生变化,现在的列表只剩两个元素了,此时循环的游标已经到头了无法再向前,于是循环停止剩下列表['bbb', 'ddd']。大家可以自己画个图来理解。
3.del list[index]
del list[start:end:步长] -> del可以一次性删除一段
del list_1[1:3:1]
print(f'del后的列表:{list_1}')
区分一下del的写法和前面的pop和remove的区别,del是写在开头的。
取值
列表可以作为一个容器,我们利用它储存元素,当需要使用其内部的元素的时候,我们也需要一些方法来将需要的元素提取出来。
1.通过索引取值 -> 和字符串的索引类似
list_1 = ['xiao', 'a', '12', [2], 'a']
print(f'索引取值第2个元素:{list_1[1]}')
2.切片: list[start: end:步长] -> 和字符串类似,能取到开始范围,不能取到结束范围
print(f'切片获取第2,3个元素:{list_1[1:3:1]}')
3.index(值,start,end) -> 得到的是一个索引
注意,只能放具体的值,如果找不到会报错
print(f'获取指定值:{list_1.index("a",0,5)}')
4.count(值) -> 获取具体值在列表中出现的次数
print(f'列表中“a”个数:{list_1.count("a")}')
这里我们来一道思考题帮助掌握运用:用户随机输入一串字符,判断每个字符出现的次数
分析一下,这道题的要点是,我们要获得输入的字符串中包含什么字符,这些字符不可以重复判断。于是,我们可以在这里使用一个列表,我们将读取到的字符放进这个列表,注意,我们需要先一个分支语句来判断只有还没有放在列表中的字符才可以被放入列表。最后将列表中的字符迭代在原字符串中计数即可。
user_str = 'gdksadgkdsafcgdsyf'
list_str = []
for i in user_str:
if i not in list_str:
list_str.append(i)
# print(f'出现了"{i}"次数:{user_str.count(i)}')
for j in list_str:
print(f'出现了"{j}"次数:{user_str.count(j)}')
推导式
推导式本质上就是用列表来构建列表,通过对已有列表中的每一项应用一个指定的表达式来构建出一个新的列表。
变量=[表达式 for 变量 in 可迭代的对象]
变量=[表达式 for 变量 in 可迭代的对象 if 条件]
表达式:指对变量的操作
list_2 = ['aaa', 'bbb', 'ccc', 'ddd']
print(f'给列表每个元素后面添加一个”!“:{[i + "!" for i in list_2]}')
推导式可以帮助我们更快的对一个列表内的所有元素进行行更改。