列表的介绍

一、什么是列表

列表是可以存储不同类型数据的有序、可变的存储容器。

二、列表的格式

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

定义变量名为arr的列表

arr=[1,'你好',hello,[1,2,3],[3,2,1.1]]
  • 列表中的元素类型可以不同
  • 列表中可以存列表
  • 列表的下标从o开始

三、获取列表下标

# 列表
arr = [1, 2, 3, 4]
print(arr) #[1, 2, 3, 4]

print(type(arr)) #<class 'list'>
newarr=arr[1:5]

print(arr[1]) # 1
print(newarr) #[2, 3, 4]

列表的增删改查

一、添加元素

append

把新元素添加到列表末尾

# append
arr = ['1', 2, 3]
print("append前的arr:", arr)
arr.append(4)
print("append后的arr:", arr)

结果为

append前的arr: ['1', 2, 3]
append后的arr: ['1', 2, 3, 4]

insert

insert(index, object) 在指定位置index前插入元素object

# insert
inArr = [1, 2, 3]
inArr.insert(1, 'tt')
print(inArr) # [1, 'tt', 2, 3]

extend

通过extend可以将另一个集合中的元素(可迭代的对象)逐一添加到列表中

# extend
exArr = ['詹姆斯', '杜兰特', '戴维斯']

# 添加一个元组tuple
exArr.extend(('库里', '哈登'))  # ['詹姆斯', '杜兰特', '戴维斯', '库里', '哈登']
print(exArr)

# 添加一个字符串
exArr.extend('你好')
print(exArr)  			# ['詹姆斯', '杜兰特', '戴维斯', '库里', '哈登', '你', '好']

# 添加一个列表
exArr.extend([1, 2, 3])
print(exArr)  		# ['詹姆斯', '杜兰特', '戴维斯', '库里', '哈登', '你', '好', 1, 2, 3]

二、修改元素

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

#定义变量A,默认有3个元素
A = ['xiaoWang','xiaoZhang','xiaoHua']

print("-----修改之前,列表A的数据-----A=%s" % A)

#修改元素
A[1] = 'xiaoLu'

print("-----修改之后,列表A的数据-----A=%s" % A)

三、删除元素

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

del:根据下标进行删除

# del删除
arr = ['李青', '艾克', '蔚', '赵信', '酒桶', '男枪']
# 删除前
print(arr)  # ['李青', '艾克', '蔚', '赵信', '酒桶', '男枪']
# 删除后
del arr[2]
print(arr)  # ['李青', '艾克', '赵信', '酒桶', '男枪']

pop:删除最后一个元素

# pop删除
pArr = ['李青', '艾克', '蔚', '赵信', '酒桶', '男枪']
# 删除前
print(pArr)  # ['李青', '艾克', '蔚', '赵信', '酒桶', '男枪']
# 删除后
pArr.pop(3)
print(pArr)  # ['李青', '艾克', '蔚', '酒桶', '男枪']

remove:根据元素的值进行删除

# remove删除:根据元素的值进行删除
rArr = ['李青', '艾克', '蔚', '赵信', '酒桶', '男枪']
# 删除前
print(rArr)  # ['李青', '艾克', '蔚', '赵信', '酒桶', '男枪']
# 删除后
rArr.remove('男枪')
print(rArr)   # ['李青', '艾克', '蔚', '赵信', '酒桶']

查找的元素

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

python中查找的常用方法为:

  • in(存在),如果存在那么结果为true,否则为false
  • not in(不存在),如果不存在那么结果为true,否则false
#待查找的列表
    nameList = ['xiaoWang','xiaoZhang','xiaoHua']

    #获取用户要查找的名字
    findName = input('请输入要查找的姓名:')

    #查找是否存在
    if findName in nameList:
        print('在列表中找到了相同的名字')
    else:
        print('没有找到')

说明:

in的方法只要会用了,那么not in也是同样的用法,只不过not in判断的是不存在

index

index(value,start,step) start开始索引,step结束索引,两个连用如两个区间没查到值报错。左开右闭区间,取到step索引之前的索引。

# index
inArr = ['李青', '艾克', '蔚', '赵信', '酒桶', '男枪']
in1 = inArr.index('赵信')
print('索引为:', in1)  # 索引为: 3
inArr2 = [1, 2, 3, 4, 5, 1, 3]
in2 = inArr2.index(3, 4)
print('索引为:', in2)  # 索引为: 6
in3 = inArr2.index(1, 3, 6)
print('索引为:', in3)  # 索引为: 5

count

用来计算某个元素出现的次数,未出现则为零

# count

countArr = [1, 2, 3, 4, 5, 3]
c1 = countArr.count(1)
print('个数为:', c1)  # 个数为: 1
# 未有的元素
c2 = countArr.count(99)
print('个数为:', c2)  # 个数为: 0
# 出现多次的元素
c3 = countArr.count(3)
print('个数为:', c3)  # 个数为: 2

列表的遍历

使用while循环

为了更有效率的输出列表的每个数据,可以使用循环来完成

heroList = ['李青', '艾克', '蔚', '赵信', '酒桶', '男枪']
# 获取长度
length = len(heroList)
i = 0
while i < length:
    print('英雄:', heroList[i])
    i += 1
 # 结果为
"""
英雄: 李青
英雄: 艾克
英雄: 蔚
英雄: 赵信
英雄: 酒桶
英雄: 男枪
"""

使用for循环

while 循环是一种基本的遍历列表数据的方式,但是最常用也是最简单的方式是使用 for 循环

for i in heroList: #herolist是可迭代对象
    print('英雄:', i)
# 结果上同

列表的嵌套

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

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

# 列表的嵌套
list = [1, 2, 3, [3, 2, 1], [1, 2, 3]]
print(list)  # [1, 2, 3, [3, 2, 1], [1, 2, 3]]
# 操作列表的索引获得元素
print(list[3])  # [3, 2, 1]
# 操作列表的索引获得元素,再次操作索引或得深成索引
print(list[3][2])  # 1

列表的推导式

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

# 列表推导式

# 基本方式
a = [x for x in range(4)]
print(a)  # [0, 1, 2, 3]
b = [x for x in range(1, 9)]
print(b)  
# [1, 2, 3, 4, 5, 6, 7, 8]

# 在循环的过程中使用if
c = [x for x in range(20) if x % 2 != 0]
print(c)  
# [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

# 2个for循环
t2 = [(x, y) for x in range(1, 4) for y in range(1, 4)]
print(t2) 
# [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)]

# 3个for循环
t3 = [(x, y, z) for x in range(1, 3) for y in range(1, 3) for z in range(1, 3)]
print(t3)  
# [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]

列表的拷贝

列表的拷贝,即列表的复制

可分为:

  • 浅拷贝:
    1. 列表的copy方法
    2. copy模块的使用
    3. 切片
  • 深拷贝:

浅拷贝

浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。

列表的copy方法

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

# 列表的copy方法
cp = [1, 2, 3, [3, 2, 1], [1, 2, 3]]
cp1 = cp.copy()
# 修改cp1
cp1[1] = 22
cp1[3][1] = 22
# 修改或拷贝后的列表
print(cp)  # [1, 2, 3, [3, 22, 1], [1, 2, 3]]
print(cp1)  # [1, 22, 3, [3, 22, 1], [1, 2, 3]]

copy模块的使用

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

# copy模块的使用
import copy  # 导入copy模块

cy = [1, 2, 3, [3, 2, 1], [1, 2, 3]]
# 调用模块中的copy方法
cy1 = copy.copy(cy)

# 修改cy1
cy1[1] = 22
cy1[3][1] = 22

# 修改或拷贝后的列表
print(cy)  # [1, 2, 3, [3, 22, 1], [1, 2, 3]]
print(cy1)  # [1, 22, 3, [3, 22, 1], [1, 2, 3]]

切片

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

# 切片的浅拷贝
ct = [1, 2, 3, [3, 2, 1], [1, 2, 3]]
ct1 = ct[::]

# 修改ct1
ct1[1] = 22
ct1[3][1] = 22

# 修改或拷贝后的列表
print(ct)  # [1, 2, 3, [3, 22, 1], [1, 2, 3]]
print(ct1)  # [1, 22, 3, [3, 22, 1], [1, 2, 3]]

深拷贝

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

# 深拷贝
dpcopy = [1, 2, 3, [3, 2, 1], [1, 2, 3]]
# 调用copy模块的deepcopy方法
deepcopy = copy.deepcopy(dpcopy)
# 修改ct1
deepcopy[1] = 22
deepcopy[3][1] = 22

# 修改或拷贝后的列表,对copy前的列表没有影响
print(dpcopy)  # [1, 2, 3, [3, 2, 1], [1, 2, 3]]
print(deepcopy)  # [1, 22, 3, [3, 22, 1], [1, 2, 3]]