Python基础知识六 列表

一、序列(sequence)

1、基本概念

  • 序列是Python中最基本的一种数据结构。序列用于保存一组有序的数据,所有的数据在序列当中都有一个唯一的位置(索引),并且序列中的数据会按照添加的顺序来分配索引。
  • 数据结构指计算机中数据存储的方式。

2、序列的分类

2.1 可变序列

  • 序列中的元素可以改变,例如:列表(list)、字典(dict)

2.2 不可变序列

  • 序列中的元素不能改变,例如:字符串(str)、元组(tuple)

二、列表(list)

1、基本概念

1.1 列表是Python中的一个对象

1.2 列表的作用

  • 列表中可以保存多个有序的数据
  • 列表是用来存储对象的对象

2、列表的使用

  • 列表的创建:通过 [ ] 来创建一个空列表
# 创建一个空列表
lst_a = []

# 创建一个列表
lst_b = [1, 2, 3, 4, 5, 6]

# 列表可以保存任意对象
lst_c = [1, 'Python', None, True, max(1, 2, 3)]
print(lst_c, type(lst_c))    # [1, 'Python', None, True, 3] <class 'list'>
  • 通过索引(index)来获取列表中的元素。索引就是元素在列表中的位置,列表当中每一个位置都会有一个索引。索引是从0开始,列表的第一个位置就是0,第二个位置是1……以此类推。
lst = [10,20,30,40,50,60]
# 获取列表中的第一个元素
print(lst[0])    # 10

# 不能超过最大索引值
print(lst[6])    # IndexError: list index out of range

# 获取列表中的倒数第二个元素
print(lst[-2])    # 50

3、切片

  • 切片是指从现有列表中获得一个子列表
  • 通过切片来获取指定的元素
  • 语法:列表名[起始 : 结束 : 步长]
  • 通过切片获取元素时,会包括起始位置的元素,不会包括结束位置的元素
  • 起始位置和结束位置的索引可以不写
    • 如果省略结束位置,则会从当前的开始位置一直截取到最后
    • 如果省略开始位置,则会从第一个元素截取到结束位置的元素,但是不包括结束位置的元素
  • 步长表示每次获取元素的间隔,默认是1(可以省略不写)
  • 步长不能是0,但可以是负数,负数表示对列表从后往前切
fruits = ['apple','orange','banana','pear','cherry','peach']
# 通过切片会获取一个新的列表,不会影响原来的列表
print(fruits[0:2])    # ['apple', 'orange']
print(fruits[2:4])    # ['banana', 'pear']
print(fruits)    # ['apple', 'orange', 'banana', 'pear', 'cherry', 'peach']

# 省略结束位置,则从当前的位置会一直截取到最后
print(fruits[1:])    # ['orange', 'banana', 'pear', 'cherry', 'peach']

# 省略开始位置 则会从第一个元素截取到结束位置,但是不包括结束位置的元素
print(fruits[:3])    # ['apple', 'orange', 'banana']

# 开始位置和结束位置都省略,则会从第一个位置截取到最后一个位置上面的元素(全部)
print(fruits[:])    # ['apple', 'orange', 'banana', 'pear', 'cherry', 'peach']

# 步长可以省略默认值为1
print(fruits[0:5:1])    # ['apple', 'orange', 'banana', 'pear', 'cherry']
print(fruits[0:5:2])    # ['apple', 'banana', 'cherry']
print(fruits[0:5:3])    # ['apple', 'pear']
print(fruits[::2])    # ['apple', 'banana', 'cherry']

# 步长可以为负数但是不能为0
print(fruits[::-1])    # ['peach', 'cherry', 'pear', 'banana', 'orange', 'apple']
print(fruits[4:1:-1])    # ['cherry', 'pear', 'banana']
print(fruits[::0])    # ValueError: slice step cannot be zero

三、通用操作

1、 +和*

  • + 可以将两个列表拼接成一个列表
  • * 可以将列表重复指定的次数(注意:2个列表之间不能做乘法,要列表和整数做乘法运算)
# + 可以将两个列表拼接成一个列表
lst = [1,2,3] + [4,5,6]     # [1, 2, 3, 4, 5, 6]
# * 可以将列表重复指定的次数
lst = [1,2,3] * 5   # [1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
lst = [1,2,3] * [4,5,6]    # TypeError: can't multiply sequence by non-int of type 'list'

2、 in和not in

  • in 用来检查指定元素是否在列表当中
  • not in 用来检查指定的元素是否不在列表当中
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
print('钢铁侠' in hero)    # True
print('蝙蝠侠' in hero)    # False
print('钢铁侠' not in hero)    # False
print('蝙蝠侠' not in hero)    # True

3、 len( )、max( )和min( )

  • len( ) 获取列表中元素的个数
  • max( ) 获取列表中的最大值
  • min( ) 获取列表中的最小值
lst = [1,2,3,4,5,6]
print(len(lst))    # 6
print(max(lst))    # 6
print(min(lst))    # 1

4、 list.index(x[, start[, end]])

  • 第一个参数 获取指定元素在列表中的位置
  • 第二个参数 表示查找的起始位置
  • 第三个参数 表示查找的结束位置

5、 list.count(x)

  • 统计指定元素在列表中出现的个数
lst = ['a','b','c','d','e','f','c','c','c']
print(lst.index('c'))    # 2
print(lst.index('c',3,7))    # 6
print(lst.count('c'))    # 4
print(lst.count('g'))    # 0

四、修改列表

  • 通过索引来修改列表中的某个元素
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
print('修改前:',hero)    # 修改前: ['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人']
hero[0] = '雷神'
print('修改后:',hero)    # 修改后: ['雷神', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人']
  • 通过切片来修改(其实就是给切片的内容重新赋值,但是赋值的内容必须是一个序列)
# 通过切片来修改
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
hero[0:3] = 'abcd'    # ['a', 'b', 'c', 'd', '黑寡妇', '蚁人']

hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
hero[0:3] = 123    # TypeError: can only assign an iterable

hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
hero[0:2] = ['黑豹','雷神','灭霸']    # ['黑豹', '雷神', '灭霸', '蜘蛛侠', '黑寡妇', '蚁人']

# 向索引为0的位置插入了一个元素
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
hero[0:0] = ['雷神']    # ['雷神', '钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人']
  • 当设置了步长时,序列中元素的个数必须和切片中元素的个数保持一致
# 当设置了步长的时候,序列中元素的个数必须和切片中元素的个数保持一致
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
hero[::2] = ['雷神']    # ValueError: attempt to assign sequence of size 1 to extended slice of size 3

hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
hero[::2] = ['雷神','灭霸','黑豹']    # ['雷神', '绿巨人', '灭霸', '黑寡妇', '黑豹']
  • 通过切片来删除元素
    • del list[起始 : 结束]
    • list[起始 : 结束] = [ ]
# 通过 del 关键字 来删除元素
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
del hero[2]    # ['钢铁侠', '绿巨人', '黑寡妇', '蚁人']

hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
del hero[1:3]    # ['钢铁侠', '黑寡妇', '蚁人']

hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
hero[1:3] = []    # ['钢铁侠', '黑寡妇', '蚁人']

五、列表的方法

1、添加

1.1 append( )

  • 向列表的末尾添加一个元素
hero = ['钢铁侠','绿巨人','蜘蛛侠']
hero[3] = '蝙蝠侠'    # IndexError: list assignment index out of range
hero.append('蝙蝠侠')    # ['钢铁侠', '绿巨人', '蜘蛛侠', '蝙蝠侠']

1.2 insert(arg1,arg2)

  • 向列表指定位置插入一个元素
  • 参数1:要插入的位置
  • 参数2:要插入的元素
hero = ['钢铁侠','绿巨人','蜘蛛侠']
hero.insert(2,'蝙蝠侠')    # ['钢铁侠', '绿巨人', '蝙蝠侠', '蜘蛛侠']

1.3 extend( iterable)

  • 使用一个新的序列来扩展当前序列(它会将该序列中的元素添加到列表中),参数需要传递一个序列。
hero = ['钢铁侠','绿巨人','蜘蛛侠']
hero.extend(['黑寡妇','蚁人'])    # ['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人']

hero = ['钢铁侠','绿巨人','蜘蛛侠']
hero += ['黑寡妇','蚁人']    # ['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人']

2、删除

2.1 pop( )

  • 根据索引删除并返回指定元素
  • 不传递索引默认删除最后一个元素
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
r = hero.pop()    # ['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇']
print(hero)    # ['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇']
print(r)    # 蚁人

hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
r = hero.pop(1)
print(hero)    # ['钢铁侠', '蜘蛛侠', '黑寡妇', '蚁人']
print(r)    # 绿巨人

2.2 remove( )

  • 删除指定元素(如果相同值的元素有多个,只会删除第一个)
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
hero.remove('蜘蛛侠')    # ['钢铁侠', '绿巨人', '黑寡妇', '蚁人']

2.3 clear( )

  • 清空列表
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
hero.clear()    # []

3、翻转

3.1 reserve( )

  • 翻转列表
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
hero.reverse()    # ['蚁人', '黑寡妇', '蜘蛛侠', '绿巨人', '钢铁侠']

4、排序

4.1 sort(key=None,reserve=False)

  • 用来对列表中的元素进行排序
  • reserve=
    • True 反序
    • False 正序
lst = list('qwerasdfzxcv')
lst.sort()    # ['a', 'c', 'd', 'e', 'f', 'q', 'r', 's', 'v', 'w', 'x', 'z']
lst.sort(reverse=True)    # ['z', 'x', 'w', 'v', 's', 'r', 'q', 'f', 'e', 'd', 'c', 'a']

六、遍历列表

1、 for循环

  • 通过for循环来遍历列表
  • 语法:
for 变量 in 序列(遍历的规则):
	代码块
  • 注意:for循环的代码块会执行多次,序列中有几个元素就会执行几次。每执行一次就会将序列中的一个元素赋值给变量,所以我们可以通过变量来获取列表中的元素。
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人']
for i in hero:
    print(i)

2、range(start, stop[, step])

参数说明:
- start:计数从start开始。默认是从0开始。例如 range(5) 等价于 range(0,5);
- stop:计数到stop结束,但不包括stop。例如 range(0,5) 是 [0,1,2,3,4] 没有5;
- step:步长,默认为1。例如 range(0,5) 等价于 range(0,5,1)。

# 获取列表中的奇数
lst = [1,2,3,4,5,6,7,8,9]
for i in range(0,9,2):
    print(lst[i])

七、浅拷贝和深拷贝

1、赋值

a = [1,2,3,[4,5]]
b = a

b[1] = 20
print('a =',a,id(a))    # a = [1, 20, 3, [4, 5]] 2281700492168
print('b =',b,id(b))    # b = [1, 20, 3, [4, 5]] 2281700492168

b[3][0] = 10
print('a =',a,id(a))    # a = [1, 20, 3, [10, 5]] 2281700492168
print('b =',b,id(b))    # b = [1, 20, 3, [10, 5]] 2281700492168
print(id(a[3]))    # 2281700491976
print(id(b[3]))    # 2281700491976

2、切片 [:]

  • 用切片[:]拷贝是一种浅拷贝,只会复制列表本身,不会复制列表中的子列表。
a = [1,2,3,[4,5]]
b = a[:]

b[1] = 20
print('a =',a,id(a))    # a = [1, 2, 3, [4, 5]] 2113364657032
print('b =',b,id(b))    # b = [1, 20, 3, [4, 5]] 2113364658312

b[3][0] = 10
print('a =',a,id(a))    # a = [1, 2, 3, [10, 5]] 2113364657032
print('b =',b,id(b))    # b = [1, 20, 3, [10, 5]] 2113364658312
print(id(a[3]))    # 2113364656840
print(id(b[3]))    # 2113364656840

3、copy()

  • copy()是一种浅拷贝,只会复制列表本身,不会复制列表中的子列表。
a = [1,2,3,[4,5]]
b = a.copy()

b[1] = 20
print('a =',a,id(a))    # a = [1, 2, 3, [4, 5]] 3279480456072
print('b =',b,id(b))    # b = [1, 20, 3, [4, 5]] 3279480457352

b[3][0] = 10
print('a =',a,id(a))    # a = [1, 2, 3, [10, 5]] 3279480456072
print('b =',b,id(b))    # b = [1, 20, 3, [10, 5]] 3279480457352
print(id(a[3]))    # 3279480455880
print(id(b[3]))    # 3279480455880

4、copy.deepcopy()

  • deepcopy()是一种深拷贝,列表中的子列表也会被复制。
import copy
a = [1,2,3,[4,5]]
b = copy.deepcopy(a)

b[1] = 20
print('a =',a,id(a))    # a = [1, 2, 3, [4, 5]] 2435489956744
print('b =',b,id(b))    # b = [1, 20, 3, [4, 5]] 2435489958024

b[3][0] = 10
print('a =',a,id(a))    # a = [1, 2, 3, [4, 5]] 2435489956744
print('b =',b,id(b))    # b = [1, 20, 3, [10, 5]] 2435489958024
print(id(a[3]))    # 2435489956552
print(id(b[3]))    # 2435489957960
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值