列表基础
列表初始化
items = [1,2,3,4,5]
items = [1]*5 #生成[1,1,1,1,1]的列表列表元素的访问
列表中的某个元素,可以使用列表名+[索引 index]的方式来读取。
colors = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print(colors[0]) #打印出red
print(colors[1]) #打印出green
print(colors[2]) #打印出blue列表的索引 index 一定是从 0 开始的,这是初学者最容易忘记的点。
例如print(colors[1])打印出来的是 green,而不是 red。
索引也可以从尾部开始,最后一个元素的索引为 -1,往前一位为 -2,以此类推。

colors = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print(colors[-1]) #打印出black
print(colors[-2]) #打印出white
print(colors[-3]) #打印出yellowcolors = [5,2,4,1,0]
print(colors[1],colors[-1])程序会输出?
len 函数
系统自带 len 函数,可以计算出一个列表的长度,如colors = ['red', 'green', 'blue', 'yellow', 'white', 'black']的长度为 6。
colors = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print(len(colors)) #输出6最佳拍档 for
用 for 来帮助我们访问列表,可以说最佳拍档。
用 for 来访问列表也有两种模式,一种是索引遍历,一种是元素遍历。
colors = ['red', 'green', 'blue', 'yellow', 'white', 'black']
print(colors[0])
print(colors[1])
print(colors[2])
print(colors[3])
print(colors[4])
print(colors[5])colors = ['red', 'green', 'blue', 'yellow', 'white', 'black']
for i in range(len(colors)):
print(colors[i])比较之后,我们可以发现,for 的元素遍历语法最精简,但是元素遍历有个很大局限性,那就是不能获取元素的索引和更新此元素。
colors = ['red', 'green', 'blue']
for i in colors:
i = 'white'
print(colors) #还是输出['red', 'green', 'blue']colors = ['red', 'green', 'blue']
for i in range(len(colors)):
colors[i] = 'white'
print(colors) #会输出['white', 'white', 'white']nums = [1, 2, 3]
for i in range(len(nums)):
nums[i] = i
for i in nums:
print(i,end=' ')程序会输出?
列表的切片
列表可以通过切片的方式来访问列表中的一部分数据,得到一个子列表。
切片的语法是列表名+[start : end : step]。(有没有觉得跟range 函数的格式很像!)
切片中 start, end, 和 step 参数有时可以忽略不写。
start 不写时,默认取到最左边
end 不写时,默认取到最右边
step 不写时,默认为 1
切片一定要记住左取右不取的原则,和 range 函数是一致的,这是初学者最容易犯错的地方!
例如nums[1:4],只能从第 1 个元素开始,取到第 4 个元素的前面一个元素,也就是第 3 个元素,最终只能取到第 1,2,3 个元素,而不能取到第 4 个元素!
nums = [10, 20, 30, 40, 50, 60, 70, 80, 90]
print(nums[1:7:2]) #从第1个元素开始,取到第6个元素,步长为2,打印出[20,40,60]
print(nums[:4]) #从最左边,取到第3个元素,打印出[10,20,30,40]
print(nums[4:]) #从第4个元素开始,取到最右边,打印出[50,60,70,80,90]
print(nums[4:1:-1]) #从第4个元素开始,取到第2个元素,步长为-1,打印出[50, 40, 30]
print(nums[:]) #从最左边,取到最右边,打印出[10, 20, 30, 40, 50, 60, 70, 80, 90]
print(nums[::-1]) #从最左边,取到最右边,步长为-1,打印出[90,80,70,60,50,40,30,20,10]
nums = [0,1,2,3,4,5,6,7,8,9]
for i in nums[4:]:
print(i,end=' ')程序会输出?
nums = [0,1,2,3,4,5,6,7,8,9]
for i in nums[4:1:-1]:
print(i,end=' ')程序会输出?
nums = [0,1,2,3,4,5,6,7,8,9]
for i in nums[1:7:2]:
print(i,end=' ')程序会输出?
nums = [0,1,2]
for i in nums[:]:
print(i,end=' ')程序会输出?
nums = [0,1,2]
for i in nums[::-1]:
print(i,end=' ')程序会输出?
列表元素的更新
colors[0]可以访问列表中的第 0 个元素,也可以通过这种方式直接更新第 0 个元素,例如:colors[0] = 'pink',也可以通过切片批量更新元素,colors[1:6:2] = [1,2,3]。
colors = ['red', 'green', 'blue', 'yellow', 'white', 'black']
colors[0] = 'pink'
print(colors[0]) #打印出pink
colors[1:6:2] = [1,2,3] #也可以通过切片批量更新元素
print(colors) #打印出['pink', 1, 'blue', 2, 'white', 3]nums = [1, 2, 3]
nums[0] = 2
for i in nums:
print(i,end=' ')程序会输出?
列表元素的增加
我们可以增加新的元素到列表尾部,使用 append 方法。要添加到任意位置,可以使用 insert 方法。
colors = ['red', 'green', 'blue']
colors.append('pink')
colors.insert(0, 'gray')
print(colors) #打印出['gray', 'red', 'green', 'blue', 'pink'nums = [1, 2, 3]
nums.append(4)
print(nums[-1])程序会输出?
列表元素的删除
我们可以使用 pop 方法,通过索引 index 来删除列表中的元素,也可以使用 remove 方法,删除列表中第一个匹配到的元素。
colors = ['red', 'green', 'blue', 'black']
colors.pop(0)
print(colors) #打印出['green', 'blue', 'black']
colors.pop() #不填参数,默认删除最后一个
print(colors) #打印出['green', 'blue']
colors.remove('blue')
print(colors) #打印出['green']nums = [1, 2, 3]
nums.pop()
print(nums[-1])程序会输出?
从输入中获取列表
从一行输入获取列表
如果多个元素在一行中输入,可以使用之前提到过的 input().split(),将这一行的元素转为列表。
nums = input().split() #1 2 3
print(nums) #[1,2,3]从多行输入获取列表
如果多个元素逐行输入,则可以使用多个 input()来设置列表元素。
nums = []
for i in range(3):
nums.append(input())
print(nums) #[1,2,3]列表操作符
列表有一些基本操作符是比较常用的,如下:
操作符 | 结果 | 描述 |
|---|---|---|
[1, 2, 3] + [4, 5, 6] | [1, 2, 3, 4, 5, 6] | 列表拼接和合并 |
['Hi!'] * 4 | ['Hi!', 'Hi!', 'Hi!', 'Hi!'] | 列表批量赋值 |
3 in [1, 2, 3] | True | 判断元素是否存在于列表中 |
4 not in [1, 2, 3] | False | 判断元素是否不在于列表中 |
nums1 = [1, 2, 3]
nums2 = [4, 5, 6]
num = 4
if num in nums1 + nums2:
print('yes')
else:
print('no')程序会输出?
列表推导式
列表推导式可以用于从某个序列中,快速构造出新的序列列表。
items = [i for i in range(5)] #生成[0,1,2,3,4]的列表
items = [i*i for i in range(5)] #生成[0,1,4,9,16]的列表nums = [i*i for i in range(1,4)]
for i in nums:
print(i,end=' ')程序会输出?
地址引用和值引用
在计算机的实际运行中,列表等序列存储的其实是一个内存地址,所有的值是在这个地址中依次存储的内容。
而普通的数字和字符串类型的变量,存储的就是一个普通的值。
下面的示例代码中,将 color1 赋值给 color2 是值引用,修改 color2 的值,不会影响 color1。
而将 colors 赋值给 new_colors 时,是地址引用,是将 colors 的地址赋予给 new_colors,所以修改 new_colors 的值,就是修改 colors 的值。
color1 = 'pink'
color2 = color1
color2 = 'white'
print(color1) #打印出pink
print(color2) #打印出white
colors = ['red', 'green', 'blue']
new_colors = colors
new_colors[0] = 'pink'
print(new_colors) #打印出['pink', 'green', 'blue']
print(colors) #打印出['pink', 'green', 'blue']要想实现一个列表的独立复制,可以使用切片的方式来实现。
colors = ['red', 'green', 'blue']
new_colors = colors[:] # 使用切片实现独立复制
new_colors[0] = 'pink'
print(new_colors) #打印出['pink', 'green', 'blue']
print(colors) #打印出['red', 'green', 'blue']nums = [1,2,3]
nums1 = nums
nums2 = nums[:]
nums1[0] = 2
nums2[1] = 3
print(nums[0], nums[1])程序会输出?