在Python中,有四种数据存储结构分别是列表、字典、元组、集合。它们都可以存放多个数据,但是在特点上也各有千秋。本篇文章我们着重来讲解一下最常见的列表。
我们都知道变量只能存放一个元素,这对元素的调用有了极大的限制,而列表就相当于一个大容器,可以存放N多个元素,程序可以使用相应的方法对整个列表的所有数据进行操作。这些元素可以是数字,字母、字符组成的字符串,也可以是任意的结构,比如列表、字典等。这其中的所有元素之间可以没有任何的关系,不必是同种数据类型。
students = ['张三', '李四', ['Mike', 'Job']]
print(students)
print(type(students))
scores = list([98, '优秀', '良好', 59])
print(scores)
print(type(scores))
列表是有许的集合,所以我们要通过元素的索引来访问列表中的任意一个元素。这里要注意的是:在Python中,第一个列表元素的索引是0,第二个元素是1,第三个是2,以此类推。
以下代码来对列表的元素进行访问
students = ['张三', '李四', ['Mike', 'Job'], 99]
print(students[0], type(students[0]))
print(students[2], type(students[2]))
print(students[3], type(students[3]))
print(students[2][1], type(students[2][1]))
print(students[2][1].upper())
由此也可以看出,访问的列表元素的类型是存放前的类型,如果是嵌套的列表,由外到内逐层访问即可。另外访问到的元素可以调用相应的方法进操作。如果指定索引不存在,会抛出IndexError。
上面的代码访问的索引均为正数,那么可不可以为负数呢?
students = ['张三', '李四', ['Mike', 'Job'], 99]
print(students[-1])
print(students[-4])
将列表索引定为负数进行访问,最后一个元素索引为-1,倒数第二个为-2,以此类推。Python这种特殊的语法极大方便了我们访问最后一个元素,因为我们经常需要在不知道列表长度的情况下访问最后一个元素。
students = ['张三', '李四', ['Mike', 'Job'], '张三', 99]
print(students.index('张三'))
print(students.index('张三', 1, 4))
上面的代码中,列表中有两个值为“张三”的元素,但是index()方法只能访问到第一个。如果指定元素不存在,抛出ValueError。在访问的元素后面加上范围,程序便只在指定的范围内进行查找。
注意:Python中的范围“下包上不包”,即范围为(1,4)指的是索引为1、2、3的元素。
切片操作语法格式
列表名[start : stop : step]
lst = [10, 20, 30, 40, 50, 60, 70, 80]
print(lst[2:6:1])
print(lst[2:6]) # step默认为1
print(lst[2:6:2])
print(lst[:6:1]) # start默认为0
print(lst[1::1]) # stop默认为最后一个
同样,切片操作里的step也可以为负数,这时切片的第一个元素默认为列表最后一个元素,切片的最后一个元素默认为列表的第一个元素。
lst = [10, 20, 30, 40, 50, 60, 70, 80]
print(lst[::-1])
print(lst[6:0:-2])
在列表中添加新的元素时,最简单的方式就是将元素附加到列表。给列表附加元素时,将它添加到列表末尾,添加后并没有创建新的列表,仅仅是将新的元素附加到了末尾。
lst = [10, 20, 30]
print('添加元素前:', lst, id(lst))
lst.append(40)
print('添加元素后:', lst, id(lst))
lst2 = [100, 90, 80]
lst.append(lst2)
print('将lst2作为一个元素添加:', lst, id(lst))
append()方法使动态创建列表易如反掌,比如我们可以先创建一个空的列表,用来存放用户输入的数据,然后将输入的每一个新值添加到末尾。
lst = []
lst.append('hello')
lst.append('world')
lst.append(99)
print(lst)
lst = [10, 20, 30]
lst2 = [100, 90, 80]
lst.extend(lst2)
print('将lst2中的元素逐一添加添加:', lst)
lst = [10, 20, 30]
lst.insert(1, 15)
print(lst)
lst = [10, 20, 30]
lst3 = [11, 22, 33]
lst[1:2] = lst3
print(lst)
观察可以发现,切片操作来实现的在任意位置添加多个元素,实际上就是将多个元素组成的列表替换掉切片选中的部分。实现的是一个替换的操作。
讲过了列表元素的添加,那么我们自然想到的就是对列表元素的删除操作。在Python中,我们可以用remove()、pop()、del语句,clear()对元素进行删除。
lst = [10, 20, 30, 40, 50, 60, 70, 80]
print('删除前的列表:', lst)
lst.remove(20) # 根据值删除元素
print('删除后的列表:', lst)
lst = [10, 20, 30, 40, 50, 60, 70, 80]
print('删除前的列表:', lst)
popped_lst = lst.pop(2) # 根据索引删除元素
print('删除后的列表:', lst, '删除的元素是:', popped_lst)
lst.pop() # 不指定索引,删除最后一个元素
print('不指定索引:', lst)
lst = [10, 20, 30, 40, 50, 60, 70, 80]
print('删除前的列表:', lst)
del lst[2]
print('删除后的列表:', lst)
pop()方法和del语句都可以根据索引删除元素,那究竟什么时候该用什么呢?下面是一个简单的判断标准:如果你要从列表中删除一个元素,并且不再以任何方式使用它,就使用del语句;如果你要在删除元素后还能继续使用它,就使用pop()方法。
另外,del语句还有删除列表的作用。删除后列表将会不存在,再次调用时,会抛出NameError。
lst = [10, 20, 30, 40, 50, 60, 70, 80]
print('删除前的列表:', lst)
del lst
print('删除后的列表:', lst)
lst = [10, 20, 30, 40, 50, 60, 70, 80]
print('删除前的列表:', lst)
lst.clear()
print('删除后的列表:', lst)
lst = [10, 20, 30, 40, 50, 60, 70, 80]
print('删除前的列表:', lst)
lst4 = lst[1:3]
print('切片后的列表:', lst4)
lst[1:3] = []
print('删除后的列表:', lst)
修改列表元素的语法与访问列表元素的语法相似,想要修改列表中的元素,可以指定列表名和要修改的元素的索引,将新的值赋给指定的元素索引。
lst = [10, 20, 30, 40, 50]
print('修改前的列表:', lst)
lst[2] = 33
print('修改后的列表:', lst)
lst = [10, 20, 30, 40, 50]
print('修改前的列表:', lst)
lst[1:3] = [90, 80, 70, 60]
print('修改后的列表:', lst)
有关列表的一些基本操作就讲到这里,比较琐碎,只有经常练习使用才能愈加熟悉。