Python基础学习(1) list详解

简述

  这部分内容是我自己做题时产生并总结的,途径是多样的(书上、ai、他人博客),存在错误在所难免。由于刚刚开始,案例也比较少,后续随着做题的增加,样本也更丰富多样后,关于list的实际应用才能更全面地展现。

一、空列表的创建

a=[]

十分明确,也比较简单
我自己一开始写的时候,犯的错误可以参考一下

a=List[] #错误方法!

二、切片操作

  切片的原理这里不再多说,讲解视频有很多,我也不再赘述,主要说一下实际的应用。

1、去掉列表前几位数

  为什么要拿出来这个说呢?在做题的时候,经常会有输入整数n,后面跟着n个数,用列表存储的话,会存入n+n个数,我们实际想要的是n个数,所以需要将第一个数去掉。(当然可以分开输入,我这里只是个引子~)

a=list(map(int,input().split()))#数据获取
n=a[0]#获取首位数字
b=a[1:]#代表去掉第一个数后,将后续数字组成一个新的列表

输入: 5 1 2 3 4 5
输出:
在这里插入图片描述

  去掉第一位数之后,其实也就会去掉前x为数了,那么我想从后面往前面去除,应该怎么弄呢?

c=a[:-1]#这样代表去除最后一位数,其他同理

  如果懂切片的小朋友,几乎一看就会明白,给不明白的小朋友仔细讲讲。

#用变量a表示正向序号,变量b表示一个列表,变量c表示反向序号
#为了格式正确,这里的a、c我也用列表写出来
a=[ 0, 1, 2, 3, 4, 5, 6, 7, 8] #正向序号
b=[ 1, 2, 3, 4, 5, 6, 7, 8, 9] #列表
c=[-9,-8,-7,-6,-5,-4,-3,-2,-1] #反向序号

  本来想通过manim生成张图片放到这,觉得有些繁琐,等后续生成一张再放到这吧。
  上面展示的比较清晰了。所以对于b[1:]来说,后面冒号虽然没有数,但是默认是到列表b的最后一位的,同理,对于b[:-1]来说,前面空缺的默认是到列表b的开头。
  但其实还有有一定差别的,对于切片而言,我们知道,b[start:end],获取的是列表b中第start位数和第end-1位数。因此,对于b[:-1]来说,其输出并不包含第-1位数,而是从第-2位数开始的,这自然也就达成了我们一开始说的从后往前删除的目标了。明白这些之后,后续再从后往前删除第x为数的切片操作,也几乎不会弄错了。

2、列表奇偶分开获取

  这里是我做题时遇到的一种情况,在这里进行一下展示。具体问题可以简化为,将列表a中的元素,每两个地转化为有序对,通过切片进行操作。
  这里就用到切片的步长操作了,对于列表a来说,a[::2]获取奇数项,a[1::2]获取偶数项。这里应该不用进行说明吧,看不明确的可以参照之前的代码块思考一下。a中的2代表步长为2.

a=list(map(int,input().split()))
b=list(zip(a[::2],a[1::2]))
#这里的zip可以理解为打包成有序对的意思,详细可以看Zip详解

输入: 1 2 3 4 5 6 7 8 9 10
输出:
在这里插入图片描述

3、列表逆序

  2025.4.2补充
  今天看到了一个很奇怪的列表切片逆序的表达方式,但仔细思考一下,确实有这种表示方式。

reverse_data = [1,3,5,0,0,0,2,4,0,0,0][::-1]

  这么写,一看上去可能很突兀,但是换成下面的表述方式就顺其自然了。

reverse_data = [1,3,5,0,0,0,2,4,0,0,0]
reverse_data=reverse_data[::-1]

三、列表推导式

  列表推导式还是比较常用的,而且整体结构看上去也比较清晰的。具体实践的话,我在manim中用的比较多,搭配一些*解包操作还是十分有用的。当然,我们这里并不深入说这些内容,还是以基础为主。

1、什么时候需要用到列表推导式?

  首先,列表推导式返回的是个列表对象。所以说,我们想通过for循环获取列表时,可以选择使用列表推导式。
  我记得之前总结过一些,可是找不到了,只能先写上面这些,后续遇到特殊例子再进行补充吧。

2、列表奇偶分开获取

  上面用了切片方法成功获取,这里用列表推导式也可以获取(这个题目本身是用for循环做的,我后面觉得用切片和列表推导式也能做,于是ai了一下,又获取了这两种方法)。

n=10 #这里指的列表长度 我们获取的是有序对,这里n一定是偶数
a=list(map(int,input().split())) #获取列表a
b=[(a[i],a[i+1])for i in range(0,n,2)]

输入: 7 8 9 2 1 3 5 1 4 2
输出 在这里插入图片描述

  列表推导式我觉得开始靠语感+多练习,列表b可以这么理解其怎么生成的:对于在范围(0,n),步长为2的i来说,逐一生成列表对象(a[i],a[i+1])。

3、列表推导式中添加if语句

  这里的例子,我们不用奇偶有序对了,选择将列表a中的对象,分奇偶,分别存储到列表b、列表c中。分析一下题目的话,其实添加了if语句,那么这样用列表推导式如何做呢?

a=list(map(int,input().split())) #获取列表a
b=[i for i in a if i%2==1]
c=[i for i in a if i%2==0]

  按照自己的理解读一读,其实也就明白了。
输入: 1 2 3 4 5 6 7 8 9 10
输出:
在这里插入图片描述
  推荐使用上面的方法,当然,下面的一个方法也是可以的

a=list(map(int,input().split())) #获取列表a
b=[a[i] for i in range(len(a)) if i%2==1]
c=[a[i] for i in range(len(a)) if i%2==0]

  注意一下二者方式,更推荐使用第一个。

四、基本方法

  这里的方法,是面向对象中的方法的意思,对于list的方法肯定有很多,我还是按照自己做题时遇到的来逐步添加。

1、append()

  这个就是在列表尾部添加元素。举个例子吧,用for循环将列表a,分奇偶组成有序对,并添加到列表b中。

n=10 #默认列表a的长度
a=list(map(int,input().split())) #获取列表a
b=[]
for i in range(0,10,2):
    b.append((a[i],a[i+1]))

输入: 1 2 3 4 5 6 7 8 9 10
输出: 在这里插入图片描述

2、删除操作

(1)切片删除

  切片删除具体的上面已经讲过了,而且删头、删尾并不需要知道列表长度,比较容易操作的。

(2)del 方法

  直接删除下标对应的列表对象,十分暴力。

a=list(map(int,input().split())) #获取列表a
del a[2]

输入: 1 2 3 4 5 6 7 8 9 10
输出:
在这里插入图片描述

(3)pop()

  这个方法跟del类似,直接删除,不过有返回值,返回值为被删除的那个数。

a=list(map(int,input().split())) #获取列表a
b=a.pop(2)

输入: 1 2 3 4 5
输出:
在这里插入图片描述

(4)remove()

  这个方法会删除列表中遇到的第一个remove传入的参数,如果没有这个参数,会报错,如果列表中有多个这个数,其只会删除第一个,后面的不会删除,而且没有返回值。

a=list(map(int,input().split())) #获取列表a
b=a.remove(2)

输入: 1 2 3 2 2 3 1
输出:
在这里插入图片描述
  如果想删除列表中,所有传入的这个数,可以采用for循环+remove的方式,当然,我们之前也说了,如果返回列表的话,且有for循环,可以选择用列表推导式来做。

a=list(map(int,input().split())) #获取列表a
b=[i for i in a if i!=2]

输入: 1 2 3 2 2 3 1
输出:
在这里插入图片描述
  当然,采用列表推导式删除的话,跟remove其实没有太大关系了~

                             分隔符

  先弄到这里吧,上面内容都是之前整理过的,本来以为很快会弄完,没想到还是用了些时间,可能还是不太熟练吧。再整理的过程其实也是一个学习过程,随着python学习的深入,肯定会有越来越多的知识添加进来的~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值