Python列表

        文章的内容是根据[小甲鱼]《零基础入门学习Python》最新版整合的一些内容,感兴趣的可以去看一看

KISS:Keep It Simple & Stupid(简洁胜于复杂)

列表序列

>>>a = [1,2,3,4,5]
>>>a[0]
# 结果为1

>>>a[4]
# 结果为5

# 那么如果一个列表很长的话,我们想输入最后一个元素怎么做呢
>>>a[-1]
# 结果也为5

因为在Python中,对于第一个元素开始从左往右的下标可以为0,1,2······,最后一个元素;而如果列表中元素特别的多时,可以反过来从最后一个元素开始左右往左的下标为-1,-2,-3······;

一、列表切片

对于Python而言,列表切片可以轻松的实现想要获取的列表范围;
例如:

>>>a = [1,2,3,4,5,6,7]
>>>a[0:3]	# a[0]到a[3],即a[0],a[1],a[2]前三位
# 1,2,3

>>>a[3:7]	# a[3]到a[7],即a[3],a[4],a[5],a[6]后四位
# 4,5,6,7

>>>a[:3]	# 即从a[0]开始到a[3]
# 1,2,3

>>>a[3:]	# 即a[3]开始到最后一个元素
# 4,5,6,7

>>>a[:]		# 即显示所有元素
# 1,2,3,4,5,6,7

>>>a[::2]	# 显示所有元素跨度为2
# 1,3,5,7

>>>a[::-1]	# 即从最后一个元素开始倒序
# 7,6,5,4,3,2,1

这里需要注意的是,切片不包括最后一个元素,是左闭右开的

二、列表的诸多方法

1、增

向列表中添加元素

append():能够添加一个元素;
extend():能在原列表的最后一个元素后面添加多个元素,extend()方法的参数必须是一个可迭代对象;

>>>heroes = ['钢铁侠','蜘蛛侠']
>>>heroes.append('美队')
>>>heroes
# '钢铁侠','蜘蛛侠','美队'

>>>heroes.extend(['雷神','黑寡妇','绿巨人'])
>>>heroes
# '钢铁侠','蜘蛛侠','美队','雷神','黑寡妇','绿巨人'

列表切片的话也可以同样实现上述两种方法:

>>>a = [1,2,3,4,5]
>>>a[len(a):] = [6]
>>>a
# [1,2,3,4,5,6]

>>>a[len(a):] = [7,8,9]
>>>a
# [1,2,3,4,5,6,7,8,9]

insert()能够实现任意位置的插入;

>>>a = [1,2,3,4]
>>>a.insert(0,0)	# 永远是在开头插入,第一个参数是插入的下标位置,第二个是插入的数据;
>>>a
# [0,1,2,3,4]

>>>a.insert(len(a),5)	# 永远是在末尾插入;
>>>a
# [0,1,2,3,4,5]

>>>a.insert(1,7)
>>>a
# [0,7,1,2,3,4,5]

2、删

remove():删除指定的元素;①如果列表中存在多个匹配的元素,那么只会删除第一个;②如果指定的元素不存在时,那么程序会报错;
pop():根据下标索引来删除特定下标位置的元素;
clear():删除列表中的所有元素;

>>>a = [1,2,3,3,4,5]
>>>a.remove(3)
>>>a
# [1,2,3,4,5]


>>>a = [1,2,3,4,5]
>>>a.insert(2,7)
>>>a.pop(2)
>>>a
# [1,2,3,4,5]


>>>a.clear()
>>>a
# []

3、改

我们可以直接索引想要修改的内容然后直接替换

>>>原神 = ['芭芭拉','诺艾尔','凝光','可莉']
>>>原神[0] = '琴'
>>>原神
# ['琴', '诺艾尔', '凝光', '可莉']

# 多个连续的替换:
>>>原神[1:] = ['椰羊','罗莎莉亚']
>>>原神
#  ['琴', '椰羊','罗莎莉亚']

对于数字的排序问题,在C语言中一般是采用循环的手段来进行排序,而在Python中则有sort()函数可以直接对数字进行排序:

>>>num = [2,3,4,4,1,2,7,3]
>>>num.sort()	# 从小到大数字的排序
>>>num
# [1, 2, 2, 3, 3, 4, 4, 7]

>>>num.reverse()	# 对列表的排序翻转
>>>num
# [7, 4, 4, 3, 3, 2, 2, 1]

# 对sort(key=None, reverse=False)而言是有两个入口参数,我们这里暂且不管第一个入口参数,对第二个入口参数而言,当reverse为True时则直接翻转列表
>>>num = [2,3,4,4,1,2,7,3]
>>>num.sort(reverse=True)
>>>num
# [7, 4, 4, 3, 3, 2, 2, 1]

4、查

count()函数可以查找某个元素在列表中重复的个数;
index()函数则可以查找某个元素的索引值,如果该元素在列表中不止一个时,index()只会找到第一个元素;
copy()函数可以将一个列表的元素复制到另一个列表;

>>>num = [3,5,7,8,3,4,5,2,1,3]

>>>num.count(3)
# 3

>>>num.index(3)	# index(x,start,end) x为要查找的元素,start和end表示要查找的范围,如果省略则默认全列表范围;
# 0

>>>num.index(3,1,len(num))
# 4


>>>num_copy1 = num.copy()
>>>num_copy1
# [3, 5, 7, 8, 3, 4, 5, 2, 1, 3]

# 同样我们也可以采用切片的方法来拷贝列表中的元素
>>>num_copy2 = num[:]
>>>num_copy2
# [3, 5, 7, 8, 3, 4, 5, 2, 1, 3]

三、嵌套列表

1、嵌套列表的创建

>>>matrix = [[1,2,3],	# 即是矩阵或二维列表
		  	 [4,5,6],
		 	 [7,8,9]]
>>>matrix
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]


# 这里我们可以使用循环来创建二维列表
>>>A = [0] * 3 	# 创建一个一维列表[0, 0, 0]
>>>for i in range(3):	
		A[i] = [0] * 3	# 这里的话是分别将A[0],A[1],A[2]的元素都替换成了一维列表[0, 0, 0]
>>>A
# [[0, 0, 0], [0, 0, 0], [0, 0, 0]]

这里需要注意的是有一种错误的写法
与上式相同我们先创造一个二维列表:

>>>B = [[0] * 3] * 3
#这种方法同样可以创造出一个二维列表[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
#但是如果对列表的元素进行替换时就会发现错误

>>>A[1][1] = 1
#结果为:
# [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
>>>B[1][1] = 1
# [[0, 1, 0], [0, 1, 0], [0, 1, 0]]
# 其实这里的B拷贝的只是对B的引用

对于上述的错误,我们可以引入is运算符(也称为同一性运算符),用来检验两个对象是否指向同一个对象(is==的区别是is比较的是对象的id,而==比较的是对象的值);

>>>x = 'nice'
>>>y = 'nice'
>>>x is y	
True

>>>x = [1,2,3]
>>>y = [1,2,3]
>>>x is y	# 对于两个列表而言,即使内容是一样的,但是列表的值是不确定的,所以Python还是为x与y列表分别开辟两个位置;
False

# 所以我们这里可以测试一下上述代码中的列表
>>>A[0] is A[1]
False

>>>A[1] is A[2]
False

>>>B[0] is B[1]
True

>>>B[1] is B[2]
True
# 从这里我们也可以看出B并没有对一维列表[0,0,0]中的B[0],B[1],B[2]重新赋值为一维列表[0,0,0],而是重复的引用同一个一维列表

2、嵌套列表的访问

>>>matrix = [[1,2,3],	
		  	 [4,5,6],
		 	 [7,8,9]]
>>>for i in matrix:		# 通过循环就可以把列表中的元素提取出来
		for each in i:	# 可以理解为matrix代表着第一层列表的个数,而each代表第二层列表的个数(或者理解为先取出矩阵的横向列表,然后打印输出这个横向列表中的每个元素)
			print(each,end=' ')
		print()
# 结果为:
#1 2 3 
#4 5 6 
#7 8 9


>>>matrix[0]	# 从这里也可以很好的解释上式代码中的两个循环的嵌套
# [1,2,3]

>>>matrix[0][0]	# 即二维数组
# 1

四、列表的拷贝

     对于列表而言,列表的赋值并不是将列表的数据赋值给变量,而是进行了引用;
     即:

>>>x = [1,2,3]
>>>y = x
>>>x[1] = 0
>>>x
# [1,0,3]
>>>y
# [1,0,3]

# 这里相当于x和y都指向列表[1,2,3]
# 所以当x改变时,y也会改变

     所以对于列表元素的赋值应该采用的是copy();而对于拷贝而言又区分为深拷贝和浅拷贝
即:

>>>x = [1,2,3]
>>>y = x.copy()	# 方法一:采用拷贝的方法来
>>>x[1] = 0
>>>x
# [1,0,3]
>>>y
# [1,2,3]

>>>x = [1,2,3]
>>>y = x[:]	# 方法二:或者是采用列表切片的方法来拷贝
>>>x[1] = 0
>>>x
# [1,0,3]
>>>y
# [1,2,3]


>>>import copy
>>>x = [1,2,3]
>>>y = copy.copy(x)	# 方法三:引入copy模块,然后调用其中的copy()函数
>>>x[1] = 0
>>>x
# [1,0,3]
>>>y
# [1,2,3]


#以上三种方法都算浅拷贝,在嵌套列表中使用会出现问题
#即:
>>>x = [[1,2,3],
		[4,5,6],
		[7,8,9]]
>>>y = x.copy()
>>>x[1][1] = 0
>>>x
# [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>>y
# [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
# 这是由于浅拷贝只拷贝了外层对象,如果包含嵌套对象的话只是拷贝了其引用;



# 深拷贝
>>>import copy
>>>x = [[1,2,3],
		[4,5,6],
		[7,8,9]]
>>>y = copy.deepcopy(x)
>>>x[1][1] = 0
>>>x
# [[1, 2, 3], [4, 0, 6], [7, 8, 9]]
>>>y
# [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 虽然能够包含了所有情况列表的拷贝列表,但是Python还是默认使用浅拷贝来拷贝列表,是因为浅拷贝一般情况下效率比深拷贝效率高;


五、列表推导式

从执行效率来说,列表推导式的效率通常要比循环语句快一倍,因为列表推导式在Python中是以更快的C语言的速度来运行的;

# 格式为:[expression for targe in iterable]

# 例如:
>>>x = [1,2,3]
>>>y = [i * 2 for i in x]	# i*2:通过从for循环获得的i值后进入表达式i*2,然后在将i*2的结果存入y中
>>>y
# [2,4,6]


>>>matrix = [[1,2,3],
		  [4,5,6],
		  [7,8,9]]
>>>diag = [matrix[i][i] for i in range(len(materix))]	# 提取出对角线的三个值
>>>diag
# [1,5,9]

而列表推导式也可以很轻松的创建一个二维列表

>>>s = [[0] * 3 for i in range(3)]

列表推导式更高阶一点的可以在里面添加if分句

[expression for target in iterable if condition]

如下例子

>>>even = [i + 1 for i in range(10) if i % 2 == 0]	# 执行顺序是先执行for语句,再执行if语句,最后执行表达式;
>>>even
# [1,3,5,7,9]


>>>words = ['Great','Fish','Excellent','Fantastic']
>>>findF_words = [w for w in words if w[0] == 'F']	# 从中找到首字母是'F'开头的单词
>>>findF_words
# ['Fish', 'Fantastic']

我们还可以嵌套列表推导式:

# 嵌套列表推导式
[expression for target1 in iterable1
			for target2 in iterable2 
						...
			for targetN in iterableN]

# 完整的列表推导式语法
[expression for target1 in iterable1 if condition1
			for target2 in iterable2 if condition2
								...
			for targetN in iterableN if conditionN]
>>>matrix = [[1,2,3],
		 	 [4,5,6],
		  	 [7,8,9]]
>>>flatten = [col for row in matrix for col in row]
>>>flatten
# [1,2,3,4,5,6,7,8,9]

# 上式即嵌套的列表推导式,而我们也可以用for语句来写:
>>>matrix = [[1,2,3],
		 	 [4,5,6],
		  	 [7,8,9]]
>>>for row in matrix:		# 外层的for循环相当于列表推导式前面的for循环,内层的for循环相当于后面的for循环
		for col in row:
			flatten.append(col)
>>>flatren
# [1,2,3,4,5,6,7,8,9]

>>>[x + y for x in 'miing' for y in 'MIING']
# ['mM', 'mI', 'mI', 'mN', 'mG', 'iM', 'iI', 'iI', 'iN', 'iG', 'iM', 'iI', 'iI', 'iN', 'iG', 'nM', 'nI', 'nI', 'nN', 'nG', 'gM', 'gI', 'gI', 'gN', 'gG']	也叫笛卡尔乘积
# 完整的列表推导式语法
# 例子:
>>>[[x, y] for x in range(10) if x % 2 == 0 for y in range(10) if y % 3 == 0]
# [[0, 0], [0, 3], [0, 6], [0, 9], [2, 0], [2, 3], [2, 6], [2, 9], [4, 0], [4, 3], [4, 6], [4, 9], [6, 0], [6, 3], [6, 6], [6, 9], [8, 0], [8, 3], [8, 6], [8, 9]]

六、与元组的差别

  1. 元组的创建使用的是()或者是不加圆括号(但有些情况要加入圆括号,所以建议使用时加上);
  2. 元组也可以通过下标来索引元素,但是元组的元素是不可变的;
  3. 元组也可以使用切片操作;
  4. 由于元组无法修改,所以就没有列表中的增删改,只余下了
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忱铭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值