python基础3--列表

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/EngineerHe/article/details/98875751

python基础3

在这里插入图片描述

数据类型

列表

list(列表)是python中使用最频繁的数据类型,在其他语言中通常就做数组;列表是写在方括号([])之间、用逗号分隔开的元素列表;它可以完成大多数集合类的数据结构实现。它支持字符,数字,字符串甚至可以包含列表(所谓嵌套),总结列表的特点如下:

  • 使用中括号括起来
  • 使用逗号分隔每一个元素
  • 列表中的元素可以是数字、字符串、列表,左右的都能放进去,嵌套任何类型
  • 列表在内存创建后可以修改
  • 与字符串一样,支持索引;支持切片;支持循环;
  • 列表的删除和修改支持索引和切片
  • list(‘字符串’) 将字符串转化为列表
  • 列表是有序的,元素可以被修改
  • 列表式一种可变数据类型

下列方法都可以创建一个list,可以使用type方法查看是否是一个列表类型。

# 直接定义
l1 = ['this', 'is', 'a', 'list']
l2 = [1, 2, 3, 4, 5, 6]
# 使用range构造一个列表
l3 = range(6)
# 使用list方法转换为列表
l4 = list('list')
# 使用推导公式创建列表
l5 = [i for i in range(6)]
# 嵌套
l6 = [1, 'ss', [2,3,4],{'key':'value'},('tuple',)]

列表的值访问和更新

使用下标索引来访问列表中的值,也可以使用切片的形式获取多个值,列表同其他语言一样,索引下标是从0开始的。

# 单下标索引
>>> list1 = ['this', 'is', 'a', 'list']
>>> print(list1[1])
is
# 切片,注意切片索引的时候,可以取到左下标不能取到右下标,如下[1:3],不能取3,只能获得下标1、2的值
>>> print(list1[1:3])
['is', 'a']
# 支持负索引,-1表示列表的最末段的元素,依次类推
>>> print(list1[-2])
a

列表是一种可变类型,可以动态地改变列表的长度和现有列表每个索引下的内容

# 修改某个索引下的值
>>> list2 = [1, 2,'a', 'b']
>>> list2[1] = 66
>>> print(list2)
[1, 66, 'a', 'b']
# append 添加元素,在现有列表的尾部添加
>>> list2.append(3)
>>> print(list2)
[1, 66, 'a', 'b', 3]
# extend 使用appen是添加某一个元素,要是另一个列表中的所有元素,可以使用extend
>>> list3 = [1,2,3]
>>> list2.extend(list3)
>>> print(list2)
[1, 2, 'a', 'b', 1, 2, 3]
# insert(i, value) 添加元素,在下标为i的地方插入value
>>> list2.insert(2, 'c')
>>> print(list2)
[1, 66, 'c', 'a', 'b', 3]
# pop删除元素,默认删除最有一个元素,并返回删除的值,还可指定下标删除,要是超出索引范围,则会抛出异常
>>> list2.pop()
3
>>> print(list2)
[1, 66, 'c', 'a', 'b']
>>> list2.pop(2)
'c'
>>> print(list2)
[1, 66, 'a', 'b']
# 使用remove移除列表中第一次出现的元素
>>> list2.remove('a')
>>> print(list2)
[1, 66, 'b']
# del 删除列表中的元素,无返回值
>>> del list2[0]
>>> print(list2)
[66, 'b']

列表脚本操作符:’+’ 和 ’ * ’ ,其中 '+‘用于组合列表,’ * '用于重复列表

# '+'拼接列表
>>> list3 = [1,2,3]
>>> list4 = [4,5,6]
>>> l = list3+list4
>>> print(l)
[1, 2, 3, 4, 5, 6]
# '*'重复列表中的元素
>>> l = list4 * 3
>>> print(l)
[4, 5, 6, 4, 5, 6, 4, 5, 6]
# in 判断元素是不是在列表中
>>> 6 in l
True
# 迭代, 遍历每一个元素
for i in list4:
	print(i, end='')
>>> 456

列表中常用的函数

>>> list5 = [1,2,3,6,7,8]
# len 获取列表的长度
>>> print(len(list5))
6
# max 获取最大值,字符也适用,如果是一个字符串,从第一个开始比较
>>> print(max(list5))
8
# min获取最小值
>>> print(min(list5))
1
# list,可以把元组、字符串转换为列表
>>> list6 = list(s)
>>> print(list6)
['s', 't', 'r']
>>> num = (1,2,3)
>>> type(num)
<class 'tuple'>
>>> list7 = list(num)
>>> type(list7)
<class 'list'>

列表中的方法

前面说了append、extend、insert、pop、remove

常用的还有count、index、sort、reverse、clear、copy

# count 统计列表中某个元素出现的次数
>>> list8 = [1,1,2,6,6,8,9]
>>> list8.count(1)
2

# index 获取某一个元素在列表中第一次出现的下标
>>> list8 = [1,1,2,6,6,8,9]
>>> list8.index(6)
3

# sort 对原列表进行排序,默认是升序排列,可以通过reverse选择升序或者降序
>>> list8.sort()
>>> list8
[1, 1, 2, 6, 6, 8, 9]
>>> list8.sort(reverse=True)
>>> list8
[9, 8, 6, 6, 2, 1, 1]

# clear 清空列表中的元素
>>> list8.clear()
>>> list8
[]
>>> print(len(list8))
0

还有一个copy方法,在这里就需要注意了注意了注意了,坑来了

先看一个例子

>>> a = [1,2,3]
>>> b = a
>>> b[0] = 66
>>> print(a)
[66, 2, 3]
>>> print(id(a))
1993459824968
>>> print(id(b))
1993459824968

这个例子中,把a的值赋值给了b,我们修改b的第一个元素,理论上a不应该改变,结果a也变了;通过查看这两个变量的id可以知道,他们在同一个地址,只是名字不一样,这是什么原因?

在python中,我们定义了 a = [1,2,3],在内存管理中先给 [1,2,3]分配内存地址,然后在这个地址上打上标签 a,所以可以说a是 [1,2,3]这个一块内存的别名,然后我们操作 b=a只是把名字换了一下,他们两个还是指向同样的地址,所以b改变a同意改变;下面在来个图说明一下:

在这里插入图片描述

更专业的说,python分为浅拷贝和深拷贝,直接放一张我画的图

在这里插入图片描述

# python中的拷贝
# 浅拷贝
a = [1, 2, 3, [4,5,6]]
b = a.copy()
c = a[:]
>>> b[0] = 66
>>> c[0] = 666
>>> print(a)
[1, 2, 3, [4, 5, 6]]
>>> print(b)
[66, 2, 3, [4, 5, 6]]
>>> print(c)
[666, 2, 3, [4, 5, 6]]
>>> c[3][1] = 555
>>> a
[1, 2, 3, [4, 555, 6]]
>>> b
[66, 2, 3, [4, 555, 6]]
>>> c
[666, 2, 3, [4, 555, 6]]
>>>

通过上面的源码可以知道,可以通过copy方法进行浅copy,也可以使用切片的方法进行copy,但是这样的操作整个复制表层的元素,深层的依然不能完全copy

import copy
>>> d = copy.deepcopy(a)
>>> d[1] = 0
>>> d[3][0] = 'xxx'
>>> priint(a)
>>> print(a)
[1, 2, 3, [4, 5, 6]]
>>> print(d)
[1, 0, 3, ['xxx', 5, 6]]

浅copy,也可以使用切片的方法进行copy,但是这样的操作整个复制表层的元素,深层的依然不能完全copy

import copy
>>> d = copy.deepcopy(a)
>>> d[1] = 0
>>> d[3][0] = 'xxx'
>>> priint(a)
>>> print(a)
[1, 2, 3, [4, 5, 6]]
>>> print(d)
[1, 0, 3, ['xxx', 5, 6]]

通过导入 copy包,使用deepcopy方法就可以实现深拷贝

猜你喜欢

转载自blog.csdn.net/EngineerHe/article/details/98875751