Python基础-3.列表

TOC

一、列表基本使用

列表的赋值

列表可以定义为空列表,以及任何数据类型的列表,列表没有特别规定里面的变量类型一直,甚至可以定义一个列表里面的变量类型各种各样。
Python中所有的赋值都是通过=符号进行赋值,如下所示:

# 创建一个空列表
test = []
# 定义赋值列表
list1 = ['red', 'green', 'blue', 'yellow', 'black']  
list2 = [38, 24, 56, 6, 1, 66, 17]  
list3 = ['google', 'baidu', 1997, 2023, 'baidu']

列表的取值

与字符串的索引一样,列表索引0开始,第二个索引是1,依此类推。
【示例】

list_data = ['apple', 'banana', 'orange', 'strawberry']
# 取list_data的第一个值
print('list_data的第一个值', list_data[0])
# 取list_data的第二个值
print('list_data的第二个值', list_data[1])
'''运行结果如下
list_data的第一个值 apple
list_data的第二个值 banana
'''

索引也可以从尾部开始,最后一个元素的索引为-1,往前一位为-2,以此类推。
【示例】

list_data = ['apple', 'banana', 'orange', 'strawberry']
# 取list_data的倒数第一个值
print('list_data的倒数第一个值', list_data[-1])
# 取list_data的倒数第二个值
print('list_data的倒数第二个值', list_data[-2])
'''运行结果如下
list_data的倒数第一个值 strawberry
list_data的倒数第二个值 orange
'''

列表的切片取值
跟字符串一样,列表也可以通过切片截取部分列表的值。
【示例】代码如下:

list_data = ['apple', 'banana', 'orange', 'strawberry', 'watermelon', 'lychee']
# 3-倒数第3的元素
print('获取第3个元素到倒数第3个元素:', list_data[2:-2])
# 4开始后面所有元素
print('获取第4个元素开始后面所有元素:', list_data[3:])
# 倒数第4开始前面所有元素
print('获取倒数第4个元素开始前面所有元素:', list_data[:-3])
'''运行结果如下
获取第3个元素到倒数第3个元素: ['orange', 'strawberry']
获取第4个元素开始后面所有元素: ['strawberry', 'watermelon', 'lychee']
获取倒数第4个元素开始前面所有元素: ['apple', 'banana', 'orange']
'''

列表可用内置函数

  • len():计算列表元素个数
  • sorted():对列表进行排序
  • max():列出列表元素最大值
  • min():列出列表元素最小值
  • list():将元组转换为列表

【示例】

list1 = ['red', 'green', 'blue', 'yellow', 'black']  
list2 = [38, 24, 56, 6, 1, 66, 17]  
list3 = ['google', 'baidu', 1997, 2023, 'baidu']
# 列表长度脚本操作符号使用len()
print('list1的长度为:', len(list1))
# 列表排序
print('list2排序后:', sorted(list2))
# 列表中最大最小值
print('list2中最大值为:', max(list2), 'list2中最小值为:', min(list2))
# 列表去重
print('list3去重后为:', list(set(list3)))
'''运行结果如下
list1的长度为: 5
list2排序后: [1, 6, 17, 24, 38, 56, 66]
list2中最大值为: 66 list2中最小值为: 1
list3去重后为: ['google', 'baidu', 1997, 2023]
'''

注意:set方法是定义一个集合,集合会自动去重,所以使用的过程中需要用list方法重新定义以下数据的类型为list列表。

二、列表操作

列表方法

  • list.append():在列表末尾添加新的元素
  • list.count():统计某个元素在列表的个数
  • list.extend():在列表末尾一次性追加另一个序列中的多个值
  • list.index():从列表中找出某个值第一个匹配项的索引位置
  • list.insert():在列表中插入元素
  • list.pop():移除列表中的一个元素(默认最后一个元素),并且返回该元素的值
  • list.remove():移除列表中某个值的第一个匹配项
  • list.reverse():列出列表的反方向顺序
  • list.sort():对列表进行排序
  • list.clear():清除空列表
  • list.copy():复制列表

添加元素

定义一个列表供下面示例使用:

fruits = ["apple", "banana"]

1.append()方法

通过append()方法在列表的末尾进行追加元素。
【示例】代码如下:

fruits.append('orange')
print('使用append()方法添加后的列表:', fruits)
'''运行结果如下
使用append()方法添加后的列表: ['apple', 'banana', 'orange']
'''

2.insert()方法

通过insert()方法在列表的指定位置插入元素,第一个参数就是指定的索引位置。
【示例】代码如下:

fruits.insert(1, 'strawberry')
print('使用insert()方法插入后的列表:', fruits)
'''运行结果如下
使用insert()方法插入后的列表: ['apple', 'strawberry', 'banana']
'''

3.extend()方法

还可以通过extend()方法扩展多个元素,相当于+=
【示例】代码如下:

fruits.extend(['watermelon', 'lychee'])
print('使用extend()方法扩展后的列表:', fruits)
'''运行结果如下
使用extend()方法扩展后的列表: ['apple', 'banana', 'watermelon', 'lychee']
'''

删除元素

定义一个列表供下面示例使用:

fruits = ['apple', 'banana', 'orange', 'strawberry']

1.remove()方法

使用remove()方法按值进行删除,只删除匹配到的第一个元素。
【示例】代码如下:

fruits.remove("banana")
print('使用remove()方法删除banana元素后的列表:', fruits)
'''运行结果如下
使用remove()方法删除banana元素后的列表: ['apple', 'orange', 'strawberry']
'''

2.pop()方法

使用pop()方法按索引进行删除,默认删除最后一个。
【示例】代码如下:

fruits.pop(1)
print('使用pop()方法删除索引为1的元素后的列表:', fruits)
'''运行结果如下
使用pop()方法删除索引为1的元素后的列表: ['apple', 'orange', 'strawberry']
'''

3.del关键字

使用del关键字删除指定位置的元素。
【示例】代码如下:

del fruits[3]
print('使用del关键字删除索引为3的元素后的列表:', fruits)
'''运行结果如下
使用del关键字删除索引为3的元素后的列表: ['apple', 'banana', 'orange']
'''

4.clear()方法

使用clear()方法清空列表。
【示例】代码如下:

fruits.clear()
print('使用clear()方法清空后的列表:', fruits)
'''运行结果如下
使用clear()方法清空后的列表: []
'''

更新列表

定义一个列表供下面示例使用:

fruits = ['apple', 'banana', 'orange', 'mongo']

1.修改单个元素

【示例】代码如下:

fruits[1] = 'watermelon'
print('修改索引为1的元素值为watermelon后的列表:', fruits)
'''运行结果如下
修改索引为1的元素值为watermelon后的列表: ['apple', 'watermelon', 'orange', 'mongo']
'''

2.修改多个元素

【示例】代码如下:

fruits[1:3] = ['strawberry', 'lychee']
print("修改索引为1到3(不包含3)的元素值为['strawberry', 'lychee']后的列表:", fruits)
'''运行结果如下
修改索引为1到3(不包含3)的元素值为['strawberry', 'lychee']后的列表: ['apple', 'strawberry', 'lychee', 'mongo']
'''

遍历列表

定义一个列表供下面示例使用:

fruits = ['apple', 'banana', 'orange', 'strawberry']

可以使用for循环配合成员运算符in对列表进行遍历查询列表中的元素。
【示例】代码如下:

num = 1
for i in fruits:
    print(f'第{num}个元素的值:', i)
    num += 1
'''运行结果如下
第1个元素的值: apple
第2个元素的值: banana
第3个元素的值: orange
第4个元素的值: strawberry
'''

还有一种简便的方法不需要我们自己去计算索引,就是使用enumerate()函数,通过start=1参数就是计数以1为起点开始计数。
【示例】代码如下:

for index, value in enumerate(fruits, start=1):
    print(f'第{index}个元素的值:', value)
'''运行结果如下
第1个元素的值: apple
第2个元素的值: banana
第3个元素的值: orange
第4个元素的值: strawberry
'''

我还想到了一种方法就是先使用len()方法获取列表的长度,再使用for循环这个长度的0到最后长度作为列表的索引值来获取所有的列表元素。

for i in range(len(fruits)):
    print(f'第{i + 1}个元素的值:', fruits[i])
'''运行结果如下
第1个元素的值: apple
第2个元素的值: banana
第3个元素的值: orange
第4个元素的值: strawberry

列表运算

定义一个列表供下面示例使用:

a = ['apple', 2, 3.14, 'mongo']
b = ['mongo', 'strawberry', 'pear', 'apple']
c = ['pear', 'mongo', 'apple', 'strawberry']
d = ['watermelon', 'lychee', 'pitaya', 'durian']
e = ['pear', 'mongo', 'lychee', 'pitaya', 'apple', 'strawberry']
f = [3.14, 'lychee', 'apple', 'pitaya']

列表拼接

列表的拼接只需通过+或者-等算术运算符进行运算即可。
【示例】代码如下:

c_d = c + d
print('c和d拼接后的列表:', c_d)
'''运行结果如下
c和d拼接后的列表: ['pear', 'mongo', 'apple', 'strawberry', 'watermelon', 'lychee', 'pitaya', 'durian']
'''

列表比较

可以直接使用比较运算符==对列表之间进行比较。
【示例】代码如下:

print('b和c列表比较的结果:', b == c)  
print('b和c列表排序后比较的结果:', sorted(b) == sorted(c))
'''运行结果如下
b和c列表比较的结果: False
b和c列表排序后比较的结果: True
'''

温馨提示:列表直接元素都是一样的但是顺序不一样都不能算列表相同,我们需要先对列表进行排序再进行比较。

特别注意:列表中存在不同类型的元素变量时不能进行排序,必须保持类型一致才能进行排序。

列表去重

我们可以使用set函数先把列表定义为集合,集合会自动去重,再用list函数定义为列表的方式来达到去重的作用。
【示例】代码如下:

a_c = a + c
print('a和c列表相加去重后的列表:', list(set(a_c)))
'''运行结果如下
a和c列表相加去重后的列表: [2, 3.14, 'strawberry', 'apple', 'mongo', 'pear']
'''

列表包含判断

列表可以使用成员运算符来判断列表是否存在包含关系。
【示例】代码如下:

print('判断列表e是否包含列表c:', c in e)
'''运行结果如下
判断列表e是否包含列表c: False
'''

使用推导式求出两个列表分别不存在的元素
【示例】这里以a和f两个列表为例,代码如下:

# 列出a中f没有的元素
data_a = [x for x in a if x not in f]
# 列出f中a没有的元素
data_b = [x for x in f if x not in a]
print(f'a中f没有的元素: {data_a}\nf中a没有的元素: {data_b}')
'''运行结果如下
a中f没有的元素: [2, 'mongo']
f中a没有的元素: ['lychee', 'pitaya']
'''

三、列表进阶使用

列表的复制

列表的复制分为浅拷贝深拷贝。下面举个例子来说明列表在操作的情况下值的变化。
【示例】创建一个列表a,b复制等于a,操作列表a观察列表b的变化,再修改列表b同样观察列表a的值的变化

# 创建列表a,赋值b = a
a = [1, 2, 3]
b = a
print('a的值为:', a)
print('b的值为:', b)
# 修改a的值
a[1] = 88
print('a被修改后的值为:', a)
print('a被修改后b的值为:', b)
# 修改b的值
b[0] = 18
print('b被修改后a的值为:', a)
print('b被修改后的值为:', b)
'''运行结果如下
a的值为: [1, 2, 3]
b的值为: [1, 2, 3]
a被修改后的值为: [1, 88, 3]
a被修改后b的值为: [1, 88, 3]
b被修改后a的值为: [18, 88, 3]
b被修改后的值为: [18, 88, 3]
'''

b随着a的值的修改,也跟着被修改了,b = a只是让b和a指向同一块内存,并没有生成新列表。所以b和a随便修改哪个的值另外一个会跟着一起变。

浅拷贝

浅拷贝会生成一个新的列表对象,但里面的元素引用不变。
一般浅拷贝会用list.copy()copy.copy()list[:]方法。
【示例】使用list.copy()浅拷贝修改值验证

# 创建列表a,赋值b = a
a = [[1, 2], [3, 4]]
b = a.copy()
print('a的值为:', a)
print('b的值为:', b)
# 修改a的值
a[0][0] = 18
print('a被修改后的值为:', a)
print('a被修改后b的值为:', b)
# 修改b的值
b[1][1] = 88
print('b被修改后a的值为:', a)
print('b被修改后的值为:', b)
'''运行结果如下
a的值为: [[1, 2], [3, 4]]
b的值为: [[1, 2], [3, 4]]
a被修改后的值为: [[18, 2], [3, 4]]
a被修改后b的值为: [[18, 2], [3, 4]]
b被修改后a的值为: [[18, 2], [3, 88]]
b被修改后的值为: [[18, 2], [3, 88]]
'''

总结:对于浅拷贝来说,会发现无论是修改a还是b原列表里的子列表也被改了。

深拷贝

深拷贝会递归复制整个对象及其子对象,彻底独立。
深拷贝使用copy.deepcopy()方法即可。
【示例】使用copy.deepcopy()方法进行深拷贝进行验证

import copy
# 创建列表a,赋值b = a
a = [[1, 2], [3, 4]]
b = copy.deepcopy(a)
print('a的值为:', a)
print('b的值为:', b)
# 修改a的值
a[0][0] = 18
print('a被修改后的值为:', a)
print('a被修改后b的值为:', b)
# 修改b的值
b[1][1] = 88
print('b被修改后a的值为:', a)
print('b被修改后的值为:', b)
'''运行结果如下
a的值为: [[1, 2], [3, 4]]
b的值为: [[1, 2], [3, 4]]
a被修改后的值为: [[18, 2], [3, 4]]
a被修改后b的值为: [[1, 2], [3, 4]]
b被修改后a的值为: [[18, 2], [3, 4]]
b被修改后的值为: [[1, 2], [3, 88]]
'''

总结:发现深拷贝无论修改谁的值都不会互相影响,a和b是两个独立的列表。

列表嵌套

列表中可以是任何类型的元素,除了常见的数字、浮点、字符串等数据类型,还可以是列表本身、字典等数据类型。
【示例】定义列表的元素为列表、字典或者混合

# 元素为列表
a = [[1, 2], [3, 4], [5, 6]]
# 元素为字典
b = [{'key1':'value1', 'key2':'value2'}, {'key3':'value3', 'key4':'value4'}]
# 元素为混合类型
c = [3.14, ['lychee', 'pitaya'], 'apple', {'key': 'value'}, 18]

四、字符串列表转换

join方法

可以用使用join()方法来将列表转化成字符串。
【示例】列表转化成字符串并以,符号隔开

a = ['red', 'green', 'blue', 'yellow', 'black']
data = ','.join(a)
print(data)
'''运行结果如下
red,green,blue,yellow,black
'''

split方法

字符串也可以使用split()方法来生成列表。
【示例】以,符号为隔断,将字符串生成列表

a = 'red,green,blue,yellow,black'
data = a.split(',')
print(data)
'''运行结果如下
['red', 'green', 'blue', 'yellow', 'black']
'''