从零开始的python学习——列表
ʕ • ᴥ • ʔ
づ♡ど
🎉 欢迎点赞支持🎉
个人主页:励志不掉头发的内向程序员;
专栏主页:python学习专栏;
文章目录
前言
一、列表、元组是什么
二、创建列表
三、访问下标
四、切片操作
五、遍历列表元素
六、新增元素
七、查找元素
八、删除元素
九、连接列表
总结
前言
我们学会了怎么创建变量后,可能会遇到一种情况,那就是有的时候我们得创建非常多的变量,但是一个一个创建感觉过于低效了,那有没有什么高效一点的方法呢?有的,兄弟有的,那就是本章节和下一章节的内容,我们一起来看看吧。
一、列表
编程中,经常需要使用变量,来保存/表示数据。如果代码中需要表示的数据个数比较少,我们直接创建多个变量即可。
num1 = 10
num2 = 20
num3 = 30
# ......
但有的时候,代码中需要表示的数据特别多,甚至也不知道要表示多少个数据。这个时候,就要用到列表和元组。
就好像小的时候去买辣条,如果只是买个一包两包,那我们拿着就走即可,但是如果买的多了,我们老板就会好心的给你一个袋子。
此处的袋子,就是列表/元组,而袋子里面的辣条就是我们要表示的数据。
列表是可变的:创建好了之后。随时能改。
二、创建列表
创建列表主要有两种方式,[ ] 表示一个空的列表。
# 创建列表# 1. 直接使用字面值来创建
# [] 就表示一个 空的列表
a = []
print(type(a))# 2. 使用 list() 来创建
b = list()
print(type(b))
list 是 Python 中的内置函数,这里创建的都是空列表。
与第二种创建方式相比第一种创建方式更加的简洁明了。而且如果需要往里面设置初始值,可以直接写在 [ ] 当中。
a = [1, 2, 3, 4]
print(a)
此时 a 列表中含有 4 个初始元素,元素之间用逗号分隔。我们可以使用 print 函数直接将我们的列表变量打印出来。
Python中的列表和C++/Java的区别在于,列表中存放的元素允许是不同类型的。
a = [1, 'hello', True, [4, 5, 6]]
print(a)
我们这个列表中就包含了 整型、字符型、布尔型、list型。
所以我们想存什么存什么。随心所欲的存放。
三、访问下标
可以通过下标访问操作符 [ ] 来获取到列表中的任意元素。
# 使用下标来访问列表元素
a = [1, 2, 3, 4]
print(a[2])
把 [ ] 放到一个列表变量后面,同时 [ ] 写上一个整数,此时它就是下标访问运算符。[ ] 中间写的这个整数,就是称为 “下标” 或者 “索引”。
我们注意到,这里打印的是 3 而不是 2。这是因为 Python 中的下标,是从 0 开始计数的,从前往后是 0、1、2、3.所以下标为 2 的位置就是 3。
当然,我们也可以使用下标去修改列表元素。
# 使用下标来修改列表元素
a = [1, 2, 3, 4]
a[2] = 100
print(a)
此时我们把下标为 2 的位置修改成 100 了。
如果是元组的话就只能通过下标去读了,就不能修改了。
由于下标是从 0 开始计算的,对于列表来说,下标的有效范围是从 0 - ( 长度-1 )。当我们下标超出有效范围的时候,尝试访问,就会出现异常。
a = [1, 2, 3, 4]
a[100] = 0
print(a)
运行此代码就会出现异常。
错误信息是给列表下标赋值的时候下标超出范围。
我们如果想要不超出有效范围,就得知道列表的长度是多少。我们获取列表长度的方式和字符串一样,都是使用 Python 的内置函数 len。
a = [1, 2, 3, 4]
print(len(a))
知道列表长度,它的有效范围就是 0 - ( 长度 - 1 )。
len 函数可以传很多类型的元素,比如 字符串、列表、元组、字典、甚至还可以是自定义的类等。
在 Python 中我们的下标还可以写成负数。
a = [1, 2, 3, 4]
print(a[len(a) - 1])
print(a[-1])
a[-2] = 100
print(a)
写成负数 n 其实就等价于下标 len(a) - n 的位置。
也可以理解负数 n 为倒数第 n 个元素。
四、切片操作
通过下标操作是一次取出里面第一个元素。
通过切片,则是一次取出一组连续的元素,相当于得到一个子列表。
使用 [ : ] 的方式进行切片操作。
# 切片操作的基本使用
a = [1, 2, 3, 4]
print(a[1 : 3])
切片操作中,[ ] 里面有两个数字,表示了一段区间。1 就是表示开始区间的下标,而 3 则表示结束区间的下标。也就是取到下标为 1 一直到下标为 3 的元素。
和 range 一样包含前面的,不包含后面的,也就是包含 1 不包含 3( [1,3) )。
当然,我们切片操作是十分灵活的,它还支持很多其他的写法。
切片操作,可以省略前后的两个边界的。
# 使用切片的时候,省略边界。
a = [1, 2, 3, 4]
print(a[1 : ])
我们省略后边界意思就是我们从下标 1(开始位置)开始一直取到整个列表结束。
也可以省略前边界。
# 使用切片的时候,省略边界。
a = [1, 2, 3, 4]
print(a[ : 2])
意思是从列表的 0 号元素开始取,一直取到结束的后边界。
在省略的切片中也可以使用负数下标。
a = [1, 2, 3, 4]
print(a[ : -1])
我们也可以把开始边界和结束边界全都省略。
a = [1, 2, 3, 4]
print(a[ : ])
得到的还是列表自身。
在 Python 中切片操作是一个比较高效的操作,进行切片的时候,只是取出了原有列表中的一个部分,并不涉及到 “数据的拷贝”。假设有一个很大的列表,进行切片,切片的范围也很大,即使如此,切片操作依然非常高效。
切片操作还可以指定 “步长”,和 range 一样每隔几个元素取一个元素就是步长。
# 带有步长的切片操作
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(a[ : : 1])
我们在原来的基础上又加了一个冒号,冒号后面跟着的数字就是步长。1 的意思就是每隔一个元素来取一下列表中的元素。
得到的就原列表。也就是说我们默认步长就是 1。
# 带有步长的切片操作
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(a[ : : 2])
将步长改成 2,此时我们的列表切片就会发生改变。
我们的步长的数值还可以是负数,当它为负数的意思是从后往前取元素。
# 带有步长的切片操作
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(a[ : : -1])
我们切片还有一个小要点,那就是当切片中的范围超出有效下标之后,不会出现异常,而是尽可能的把符合要求的元素给获取到。
# 带有步长的切片操作
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
print(a[1 : 100])
我们编译器会尽可能的往下取,但是如果取到边界还没结束,它就会提前结束,而不会往下取了。
五、遍历列表元素
“遍历” 指的是把元素一个一个的取出来,在分别进行处理。
最简单的办法就是使用 for 循环。
a = [1, 2, 3, 4, 5]
for elem in a:print(elem)
我们在遍历过程中,循环里面写的,不一定是打印,还可以是别的。elem 就代表了列表中的每个元素,是 element 单词的缩写。我们 in 后面要求是一个可迭代对象,所以也可以是一个列表。
我们还可以使用 for 循环通过下标的方式遍历。
a = [1, 2, 3, 4, 5]
for i in range(0, len(a)):a[i] = a[i] + 10print(a)
但是我们之前的 elem 是不能直接加减的,因为我们列表中的变量赋值给 elem时,它就已经变成一个新的变量了,然后我们对 elem操作,就不会对我们的列表产生影响。
a = [1, 2, 3, 4, 5]
for elem in a:elem = elem + 10print(a)
我们可以看到我们的值还是不变的。
我们也可以通过 while 循环,通过下标来遍历。
a = [1, 2, 3, 4, 5]
i = 0
while i < len(a):print(a[i])i += 1
六、新增元素
使用 append 方法,向列表末尾插入一个元素(尾插)。
a = [1, 2, 3, 4]
a.append(5)
a.append('hello')
print(a)
我们往列表末尾插入了一个 5 和一个 字符串,此处的 append 是搭配列表对象 a 来一起使用的,而不是作为一个独立的函数。这种要搭配对象来使用的函数,也叫做 “方法”(method)。在 Python 中,对象就可以视为是 “变量”。
使用 insert 方法,向任意位置插入一个元素。
a = [1, 2, 3, 4]
a.insert(1, 'hello')
print(a)
insert 这个函数有两个参数,第一个参数是我们要插在哪个下标位置,第二个参数就是要插入什么元素数据。
这样就把 hello 插到我们下标为 1 的位置了。
如果我想插的位置越界了会怎么样。
a = [1, 2, 3, 4]
a.insert(100, 'hello')
print(a)
它会默认尾插。
七、查找元素
使用 in 操作符,判定元素是否在列表中存在,返回值是布尔类型。
a = [1, 2, 3, 4]
print(1 in a)
print(10 in a)
这个操作就是判断我们的 1 和 10 存在不在列表 a 中。
这个操作本质就是把每个数字遍历一遍看看有没有我们想要的那个数据,只不过不用我们手动写。我们还可以和我们的取反符 not 一起用
a = [1, 2, 3, 4]
print(1 not in a)
print(10 not in a)
意思就是看看 1 和 10 在 a 中是不是不存在。
使用 index 方法来判定当前元素在列表中的位置,得到一个下标。
a = [1, 2, 3, 4]
print(a.index(2))
index 的参数是我们想要查询的对象,我们这里就是查询 2 和 100 在我们列表中存不存在,存在就返回下标。
如果不存在就会异常。
a = [1, 2, 3, 4]
print(a.index(100))
八、删除元素
使用 pop 方法删除最末尾元素。
a = [1, 2, 3, 4]
a.pop()
print(a)
使用 pop 也能按照下标来删除元素,pop 的参数可以传一个下标过去。
a = [1, 2, 3, 4]
a.pop(1)
print(a)
使用 remove 方法,按照值删除元素。它的参数是我们想要删除的值。
a = ['aa', 'bb', 'cc', 'dd']
a.remove('cc')
print(a)
九、连接列表
使用 + 能够把两个列表拼接在一起。
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = a + b
print(c)
此处的 + 结果会生成一个新的列表,而不会影响到旧的列表内容。
如果我们把 a 和 b 颠倒一下顺序,那就是相反的结果。
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = b + a
print(c)
这就是我们基本的列表拼接。
使用 extend 方法,相当于把一个列表拼接到另一个列表后面。这个拼接会修改内容。
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
a.extend(b)
print(a)
print(b)
我们的 a 列表已经发生了改变。
extend 方法是没有返回值的,如果拿一个变量去保存,我们就什么都保存不到。
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
c = a.extend(b)
print(c)
我们的 None 就是啥也没有的意思。
我们还可以使用 += 来进行拼接。
a = [1, 2, 3, 4]
b = [5, 6, 7, 8]
a += b
print(a)
print(b)
我们可以看出它的执行效果和 extend 是差不多的,但其实它们的逻辑相差的还是蛮大的,我们 a += b 其实是 a = a + b,a + b 会产生一个大的列表,然后这个大的列表在赋值给 a,因为要拷贝一个大的列表,所以这个操作是更低效的。而 a.extend(b) 则是直接把 b 的内容拼到了 a 的后面,没有拷贝,所以会高效很多。
总结
我们列表的内容还是蛮多的,大家好好消化和吸收,它是我们一次性创建多个变量的好帮手,我们在搞懂列表后,我们的下一章节的元组就会简单很多。大家加油。
🎇坚持到这里已经很厉害啦,辛苦啦🎇
ʕ • ᴥ • ʔ
づ♡ど