Python中的列表

  • 基本使用
  • 增删改查
  • 遍历
  • 嵌套
  • 推导式
  • 复制

列表的基本使用

一、列表的格式

定义列的格式:[元素1, 元素2, 元素3, …, 元素n]

1
names = ['张三', '李四', '王五', 'jack', '张飞', '关羽', '马超', '王昭君', '蔡文姬']
1
2
# 类型为list
type(names)
list

二、使用下标获取列表元素

1
names[3]
'jack'

列表的数据操作

我们对于可变数据(例如,列表,数据库等)的操作,一般包含增、删、改、查四个方面。

一、添加元素

添加元素的几个方法:

  • append 在末尾添加元素
  • insert 在指定位置插入元素
  • extend 合并2个列表
append 会把新元素添加到列表的末尾
1
2
names.append('mike')
names
['张三', '李四', '王五', 'jack', '张飞', '关羽', '马超', '王昭君', '蔡文姬', 'mike']
insert(index, object) 在指定位置index前插入元素object
1
2
names.insert(3,'Ann')
names
['张三', '李四', '王五', 'Ann', 'jack', '张飞', '关羽', '马超', '王昭君', '蔡文姬', 'mike']
extend 通过extend可以将另一个集合中的元素逐一添加到列表中
1
names_1 = ['kim','mario','ken']
1
2
names.extend(names_1)
names
['张三',
 '李四',
 '王五',
 'Ann',
 'jack',
 '张飞',
 '关羽',
 '马超',
 '王昭君',
 '蔡文姬',
 'mike',
 'kim',
 'mario',
 'ken']

修改元素

通过指定下标来访问列表元素,因此修改元素的时候,为指定的列表下标赋值即可。

1
2
names[3] = '项羽'
names
['张三',
 '李四',
 '王五',
 '项羽',
 'jack',
 '张飞',
 '关羽',
 '马超',
 '王昭君',
 '蔡文姬',
 'mike',
 'kim',
 'mario',
 'ken']

查找元素

所谓的查找,就是看看指定的元素是否存在,以及查看元素所在的位置,主要包含一下几个方法:

  • in 和 not in
  • index 和 count
in, not in

python中查找的常用方法为:

  • in(存在),如果存在那么结果为true,否则为false
  • not in(不存在),如果不存在那么结果为true,否则false
1
2
b1 = '马超' in names
b1
True
1
2
b2 = 'kim' not in names
b2
False
index, count
  • index用来查找元素所在的位置,如果未找到则会报错;
  • count用来计算某个元素出现的次数。它们的使用和字符串里的使用效果一致。
1
names
['张三',
 '李四',
 '王五',
 '项羽',
 'jack',
 '张飞',
 '关羽',
 '马超',
 '王昭君',
 '蔡文姬',
 'mike',
 'kim',
 'mario',
 'ken']
1
names.index('kim')
11
1
2
# 注意是左闭右开区间, 未查到时会报错
names.index('kim',2,11)
---------------------------------------------------------------------------

ValueError                                Traceback (most recent call last)

<ipython-input-84-2016d5a97aaf> in <module>
      1 # 注意是左闭右开区间, 未查到时会报错
----> 2 names.index('kim',2,11)


ValueError: 'kim' is not in list
1
names.index('kim',1,13)
11
1
2
names.insert(3,'jack')
names
['张三',
 '李四',
 '王五',
 'jack',
 '项羽',
 'jack',
 '张飞',
 '关羽',
 '马超',
 '王昭君',
 '蔡文姬',
 'mike',
 'kim',
 'mario',
 'ken']
1
names.count('jack')
2
1
names.count('kim')
1

删除元素

列表元素的常用删除方法有:

  • del:根据下标进行删除
  • pop:删除最后一个元素
  • remove:根据元素的值进行删除
1
names
['张三',
 '李四',
 '王五',
 'jack',
 '项羽',
 'jack',
 '张飞',
 '关羽',
 '马超',
 '王昭君',
 '蔡文姬',
 'mike',
 'kim',
 'mario',
 'ken']
1
2
del names[3]
names
['张三',
 '李四',
 '王五',
 '项羽',
 'jack',
 '张飞',
 '关羽',
 '马超',
 '王昭君',
 '蔡文姬',
 'mike',
 'kim',
 'mario',
 'ken']
1
2
names.pop()
names
['张三',
 '李四',
 '王五',
 '项羽',
 'jack',
 '张飞',
 '关羽',
 '马超',
 '王昭君',
 '蔡文姬',
 'mike',
 'kim',
 'mario']
1
2
names.remove('mike')
names
['张三',
 '李四',
 '王五',
 '项羽',
 'jack',
 '张飞',
 '关羽',
 '马超',
 '王昭君',
 '蔡文姬',
 'kim',
 'mario']

排序

  • sort方法是将list按特定顺序重新排列,默认为由小到大,参数reverse=True可改为倒序,由大到小。
  • reverse方法是将list逆置。
1
2
3
a1 = [1, 4, 2, 3]
a1.sort()
a1
[1, 2, 3, 4]
1
2
a1.sort(reverse=True)
a1
[4, 3, 2, 1]
1
2
3
4
# reverse方法是将list逆置。
a2 = [1, 4, 2, 3]
a2.reverse()
a2
[3, 2, 4, 1]

练习:请删除列表 words = [‘hello’,’’,’,’good’,’hi’,’’,’yes’,’’,’no’] 里所有的空字符串。

1
2
3
4
5
6
7
words = ['hello','','good','hi','','yes','','no']
num1 = words.count('') # 3
i = 0
while i < num1:
words.remove('')
i += 1
words
['hello', 'good', 'hi', 'yes', 'no']

列表的循环遍历

一、while循环

1
2
3
4
5
names_len = len(names) # len() 获取列表长度
i = 0
while i < names_len:
print(names[i])
i += 1
张三
李四
王五
项羽
jack
张飞
关羽
马超
王昭君
蔡文姬
kim
mario

二、for循环

1
2
for name in names:
print(name)
张三
李四
王五
项羽
jack
张飞
关羽
马超
王昭君
蔡文姬
kim
mario

练习:实现冒泡排序

1
2
3
4
5
6
7
8
nums = [5, 1, 7, 6, 8, 2, 4, 3]
for i in range(0,len(nums)-1):
for j in range(0,len(nums)-1-i):
if nums[j] > nums[j+1]:
tmp = nums[j]
nums[j] = nums[j+1]
nums[j+1] = tmp
nums
[1, 2, 3, 4, 5, 6, 7, 8]

列表的嵌套

类似while循环的嵌套,列表也是支持嵌套的

一个列表中的元素又是一个列表,那么这就是列表的嵌套

此处重点掌握怎么操作被嵌套的列表

也就是说,操作嵌套列表,只要把要操作元素的下标当作变量名来使用即可。

1
2
username = [[1,11,111],[2,22,222],[3,33,333,333]]
username[0][0]
1
1
username[1][2]
222

练习:一个学校,有3个办公室,现在有8位老师等待工位的分配,请编写程序,完成随机的分配

1
2
3
4
5
6
7
8
9
10
import random
# 定义一个列表用来保存3个办公室
offices = [[],[],[]]
# 定义一个列表用来存储8位老师的名字
names = ['A','B','C','D','E','F','G','H']
# 分配
for name in names:
index = random.randint(0,2)
offices[index].append(name)
offices
[['B', 'D', 'E'], ['G', 'H'], ['A', 'C', 'F']]

列表的推导式

所谓的列表推导式,就是指的轻量级循环创建列表

1、基本方式

1
2
a = [x for x in range(0,4)]
a
[0, 1, 2, 3]
1
2
b = [x for x in range(0,10,2)]
b
[0, 2, 4, 6, 8]

2、在循环的过程中使用if

1
2
c = [x for x in range(0,10) if x%2==0]
c
[0, 2, 4, 6, 8]
1
2
d = [x for x in range(0,10) if x%2 != 0]
d
[1, 3, 5, 7, 9]

3、2个for循环

1
2
e = [(x,y) for x in range(0,4) for y in range(3)]
e
[(0, 0),
 (0, 1),
 (0, 2),
 (1, 0),
 (1, 1),
 (1, 2),
 (2, 0),
 (2, 1),
 (2, 2),
 (3, 0),
 (3, 1),
 (3, 2)]

4、3个for循环

1
2
f = [(x,y,z) for x in range(0,2) for y in range(0,3) for z in range(0,2)]
f
[(0, 0, 0),
 (0, 0, 1),
 (0, 1, 0),
 (0, 1, 1),
 (0, 2, 0),
 (0, 2, 1),
 (1, 0, 0),
 (1, 0, 1),
 (1, 1, 0),
 (1, 1, 1),
 (1, 2, 0),
 (1, 2, 1)]

列表的复制

Python中的赋值运算都是引用(即内存地址)的传递。对于可变类型来说,修改原数据的值,会改变赋值对象的值。

1
2
3
4
5
a = 12
b = a
b = 13
print(b)
print(a)
13
12
1
2
3
4
5
nums1 = [1, 5, 8, 9, 10, 12]
nums2 = nums1
nums2[0] = 100
print(nums2)
print(nums1)
[100, 5, 8, 9, 10, 12]
[100, 5, 8, 9, 10, 12]

1、列表的copy方法

使用列表的copy方法,可以直接将原来的列表进行复制,变成一个新的列表,这种复制方式是浅复制。

1
2
3
4
5
nums1 = [1, 5, 8, 9, 10, 12]
nums2 = nums1.copy()
nums2[1] = 20
print(nums1)
print(nums2)
[1, 5, 8, 9, 10, 12]
[1, 20, 8, 9, 10, 12]

2、copy模块

除了使用列表的copy方法以外,Python还提供了copy模块来复制一个对象。copy模块提供了浅复制和深复制两种方式,它们的使用方式相同,但是执行的效果有一定的差异。

浅拷贝

浅拷贝只会拷贝最外层的对象,里面的数据不会拷贝,而是直接指向

1
2
3
4
5
6
7
8
9
10
11
import copy
words1 = ['hello', 'good', ['yes', 'ok'], 'bad']
words2 = copy.copy(words1)
words2[0] = '你好'
words2[2][0] = 'no'
print(words1)
print(words2)
print(id(words1))
print(id(words2))
# # 浅拷贝只会拷贝最外层的对象,里面的数据不会拷贝,而是直接指向
# 区别在于 no
['hello', 'good', ['no', 'ok'], 'bad']
['你好', 'good', ['no', 'ok'], 'bad']
2953932539008
2953932723264
深拷贝

深拷贝是对于一个对象所有层次的递归拷贝。

1
2
3
4
5
6
7
8
9
10
import copy
words1 = ['hello', 'good', ['yes', 'ok'], 'bad']
# 深拷贝会将对象里的所有数据都进行拷贝
words2 = copy.deepcopy(words1)
words2[0] = '你好'
words2[2][0] = 'no'
print(words1)
print(words2)
print(id(words1))
print(id(words2))
['hello', 'good', ['yes', 'ok'], 'bad']
['你好', 'good', ['no', 'ok'], 'bad']
2953932723968
2953932723392
切片

列表和字符串一样,也支持切片,切片其实就是一种浅拷贝。

1
2
3
4
5
6
words1 = ['hello', 'good', ['yes', 'ok'], 'bad']
words2 = words1[:]
words1[0] = '你好'
words1[2][0] = 'no'
print(words1)
print(words2)
['你好', 'good', ['no', 'ok'], 'bad']
['hello', 'good', ['no', 'ok'], 'bad']
作者

Fahsa

发布于

2021-01-07

更新于

2021-01-07

许可协议

评论