前面在基础类型讲解中简介过列表的基本用法,包括增(append,insert),删(pop),改,查。本节做个详细的介绍。
一 列表是什么
列表list 由一系列按特定顺序排列的元素组成,可以将任何东西加入列表中,并且元素之间可以没有任何关系。定义列表用符号:[ ] ,元素之间用 “ ,” 分割。
L = [1, 2.88, '小王', True]
print(L) # 输出为 [1, 2.88, '小王', True]
二 列表常见用法
(1)访问元素
列表的索引从0开始,上例中L = [1, 2.88, '小王', True]元素的索引依次是0,1,2,3。访问元素,需要用到元素索引。也可以倒着索引,最后一个元素的索引为-1。索引要在正确的范围内,不然会抛出IndexError错误。
L = [1, 2.88, '小王', True]
# 从前往后索引
a = L[0]
b = L[1]
c = L[2]
d = L[3]
#################
# 从后往前索引
a1 = L[-1]
b1 = L[-2]
c1 = L[-3]
d1 = L[-4]
print(a,b,c,d,a1,b1,c1,d1) #输出 1 2.88 小王 True True 小王 2.88 1
# e= L[-5] IndexError
(2)修改,增加,删除元素
① 修改
通过索引拿到元素之后,直接赋值就可以实现修改的目的。
L = [1, 2.88, '小王', True]
print('修改前的第一个元素是: ' + str(L[0])) #字符串拼接需要 + 两侧都是str类型,第一个元素类型为int,可以用str()强制转换类型
L[0] = 888
print('修改后的第一个元素是: ' + str(L[0]))
输出为:
修改前的第一个元素是: 1
修改后的第一个元素是: 888
② 增加
- 使用append可以将元素 追加 到list末尾;
- 使用insert可以将元素 插入 到list任何位置;
L = []
print(L)
L.append("小王")
print(L)
L.append("大王")
print(L)
L.append("老王")
print(L) # 通过append追加到末尾
######################################
L.insert(1, "王中王") #插入到索引为1的位置
print(L)
输出为:
[]
['小王']
['小王', '大王']
['小王', '大王', '老王']
['小王', '王中王', '大王', '老王']
③删除
- 根据索引删除,使用del ,pop 方法
- 根据值删除,使用remove 方法
del 和pop 的区别在于del 没有返回删除的元素,pop可以拿到返回的元素。
L = ['小王abc', '王中王', '大王', '老王', '88888']
print(L)
del L[1] # 把索引为1的 '王中王' 删除
print(L)
s = L.pop(0) # 把索引为0的 '王中王' 删除,同时返回删除的元素,可以对他做一些想要的操作
print('删除了元素 '+s+' ,并把他修改为'+s.upper()) #upper可以把字符串改为大写
print(L)
L.pop() #pop没有参数,默认删除最后一个
print(L)
输出为:
['小王abc', '王中王', '大王', '老王', '88888']
['小王abc', '大王', '老王', '88888']
删除了元素 小王abc ,并把他修改为小王ABC
['大王', '老王', '88888']
['大王', '老王']
上例中是根据索引删除的,下面看remove直接删除值:
L = ['小王', '王中王', '小王']
print(L)
L.remove('小王') #直接把 '小王' 删除,
print(L)
输出:
['小王', '王中王', '小王']
['王中王', '小王']
可以看出,remove只会删除列表中第一次出现的 指定值。
④判断元素在不在列表中
使用 in 判断:
L = ['A', 'B', 'C']
if 'A' in L:
L.remove('A') # L中有'A',就删除'A'
print(L)
if 'D' not in L:
L.append('D') # L中没有'D',就追加'D'
print(L)
输出为:
['B', 'C']
['B', 'C', 'D']
(3)排序,翻转
- 排序用sort,sorted方法;
- 翻转用reverse,reversed 方法;
sort,reverse是直接更改了原list。sorted,reversed是新生成了一个list,原list不变;可以同时传入参数reversed=True/False,是否对排序后的列表进行翻转。
L = ['A', 'C', 'B', 'D']
print(L) # ['A', 'C', 'B', 'D']
L.sort()
print(L) # ['A', 'B', 'C', 'D'], 可见sort直接更改了原list
L2 = ['A', 'C', 'B', 'D']
print(L2) # ['A', 'C', 'B', 'D']
L3 = sorted(L2) # sorted返回一个新的list
print(L2) #['A', 'C', 'B', 'D'] #原来的list不变
print(L3) #['A', 'B', 'C', 'D']
reverse 和 sort 一样,更改了原list。reversed和 sorted 一样,保留了原list。可以尝试自己写一下。
L = ['A', 'C', 'B', 'D']
print(L) # ['A', 'C', 'B', 'D']
L.reverse()
print(L) # ['D', 'B', 'C', 'A'], 可见sort直接更改了原list
L2 = ['A', 'C', 'B', 'D']
print(L2) # ['A', 'C', 'B', 'D']
L3 = reversed(L2) # sorted返回一个 iterator,需要用list强转才能变成list
print(L2) #['A', 'C', 'B', 'D']
print(L3) # <list_reverseiterator object at 0x01580910>
print(list(L3)) #['D', 'B', 'C', 'A']
三 操作列表
包括常见的for循环,快速创建列表,切片,复制。
(1) for循环
我们经常需要遍历列表的所有元素,对每个元素执行相同的操作,这种情景适用于for循环。
先看个简单的例子:
L = [1, 2, 3, 4, 5]
for x in L:
print(x)
print('遍历结束')
输出为:
1
2
3
4
5
遍历结束
解析:
- 第一行初始化一个列表,包含5个数字;
- 执行到第二行,这行代码让 Python 获取列表 L 中的第一个值 1,并将其存储到变量 x 中。x是用于存储列表中每个值的临时变量,可指定任何名称。即:取出第一个数,赋值给临时变量x。
- 执行到第三行,打印x,即打印 1。此时for循环中的代码块已经执行完毕,将再次开启循环。
- 代码回到第二行执行,上一次遍历取出的是第一个元素,这次取出第二个元素,赋值给临时变量x。
- 代码到第三行,打印x,即打印2。第二次循环完毕。
- 再次回到第二行执行相同操作。
...... - 直到list中所有元素,都执行了一次代码块,即认为遍历结束。
- 遍历结束,执行第四行,程序结束。
总结:每次遍历,将list中的每个元素都执行了相同的操作。遍历结束后,程序才会继续执行for循环之后的代码。
(2) 快速创建list
- 借助range()函数,可以轻松地生成一系列的数字。
for i in range(1,5):
print(i)
输出:
1
2
3
4
#注意没有打印 5 ,也就是打印的数据包含头不包含尾。
- 借助range()函数, 创建数字列表
如果将 range() 作为 list() 的参数,输出将为一个数字列表。
L=list(range(1,5))
print(L) #输出为 [1, 2, 3, 4]
使用函数 range() 时,还可指定步长。例如,下面的代码打印 1~10 内的偶数
L = list(range(2, 11, 2))
print(L) # [2, 4, 6, 8, 10] , 从 2 开始数,然后不断地加 2 ,直到达到或超过终值( 11 )
- 列表生成式
列表解析 将 for 循环和创建新元素的代码合并成一行,并自动附加新元素
比如创建1~10 的数的平方的list:
L = [i * i for i in range(1, 11)]
print(L) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
还可以对 i 加限制条件:
L = [i * i for i in range(1, 11) if i%2==0] #偶数的平方
print(L) # [4, 16, 36, 64, 100]
(3) 切片
切片:取出list的部分元素,结果依然是一个list,切片使用符号 :,需要制定两个元素索引,依然是包含头不包含尾。
比如取出列表中的前五个数:
L = [i +1 for i in range(1, 20) if i%2==0] #取出1-20中的偶数,并+1,形成新的list
print(L)
L2=L[0:5] # 使用切片,取出L中的前五个元素,结果是一个新的list
print(L)
print(L2)
输出:
[3, 5, 7, 9, 11, 13, 15, 17, 19]
[3, 5, 7, 9, 11, 13, 15, 17, 19]
[3, 5, 7, 9, 11]
标准方式要指定两个元素索引,也可以不指定:
L = [i + 1 for i in range(1, 20) if i % 2 == 0] # 取出1-20中的偶数,并+1,形成新的list
print(L)
print(L[:3]) # 如果你没有指定第一个索引, Python 将自动从列表开头开始
print(L[2:]) # 如果你没有指定第二个索引, Python 将让切片终止于列表末尾
print(L[-3:]) # 倒着索引,最有一个元素索引为-1 ,输出后三个
输出:
[3, 5, 7, 9, 11, 13, 15, 17, 19]
[3, 5, 7]
[7, 9, 11, 13, 15, 17, 19]
[15, 17, 19]
(4) 复制
要复制列表,可创建一个包含整个列表的切片,方法是同时省略起始索引和终止索引( [:] )。这让 Python 创建一个始于第一个元素,终止于最后一个元素的切片,即复制整个列表。
注意 :使用 L1=L2,不可以实现复制;
L = ['A', 'B', 'C']
L2 = L[:]
print(L2) #可以看到内容和L一样
L.append("D")
L2.append("E") #分别给两个列表追加不同的元素
print(L)
print(L2)
输出:
['A', 'B', 'C']
['A', 'B', 'C', 'D']
['A', 'B', 'C', 'E']
列表的使用总结的差不多了,都是基本语法。要记牢,才能自己会写同时能看懂别人的代码~
点赞评论走起啊~