python 列表(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

列表是python最基本的数据结构之一,也就是说学习python就必须学会列表的使用

一.什么是列表

列表(list)其实就是一种存放各种数据的有序集合,在这个集合中,各种数据可以是同一种类型,也可以是不同中类型。

list1 = [1, 2, 3, 4]
list2 = ['臣', [1, 2], 5]

像列表list1中存放的数据就是同一种类型,全部都是int类型,而列表list2里面的数据的类型就五花八门了,有字符串、列表、整数。由此可见,列表中既可以存放同一类型,也可以存放多种类型。

二.如何创建空列表

在写代码的时候,我们经常需要创建一个空列表。

list1 = []

只需要一个中括号,我们就可以创建出我们想要的空列表。

三.列表的索引与切片

前面介绍了,列表是一种存放数据的有序集合,既然是有序的,那列表里面的数据就一定有编号,这个编号就是列表的索引。
列表里面的数据从左到右,依次从0开始排序(记住是从0开始排序!),就像列表list1

list1 = ['我', '是', 'p', 'y', 't', 'h', 'o', 'n']

其中,'我’的索引就是0,'是’的索引就是1,'p’的索引就是2,这样排下去,到’n’的索引就是7。
我们刚才说了是从左到右开始排序,那能从右到左开始排吗?答案当然是能。从右开始排,右边第一位的索引为-1,第二位为-2,这样一直排下去。
以list1为例,'n’的索引就是-1,'o’的索引就是-2,'h’的索引就是-3,这样一直排下去,'我’的索引就是-8。

1.如何查找元素的索引
index:

既然列表中的元素有索引,那就肯定有查找索引的办法,总不能让我们自己去数吧。那如何查找索引呢?这时候,我们就要用到index方法了。

list1 = ['我', '是', 'p', 'y', 't', 'h', 'o', 'n']
print(list1.index('我'))

程序运行之后,会输出0。
那么,index有什么特点呢?
1.输出的索引是从左到右。
2.如果你要查的元素在列表中多次出现,index只会返回它第一次遇到的元素的索引,也就是从左到右,元素第一次出现的位置的索引。

list1 = [1, 5, 7, 7, 9, 7]
print(list1.index(7))

# 程序输出:
# 2

3.如果查找的元素没有在列表中出现,那么程序就会报ValueError的错误。

list1 = [1, 5, 7, 7, 9, 7]
print(list1.index(8))

# 程序输出:
# ValueError: 8 is not in list

4.index可以在指定范围内查找元素索引。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
print(list1.index(2, 4, 7))

# 程序输出:
# 5

如果要在指定范围内查找,这时候index有三个参数,第一个是查找内容,第二个是起始范围的索引,第三个是终止范围的索引(终止范围的索引的元素并没有被纳入索引范围,就像上面的代码一样,程序只在索引为4、5、6这三个元素中查找,也就是索引范围是左闭右开区间)。
其中,第三个参数,终止范围如果没有写,就是从起始范围开始查找,一直到列表结束。

enumerate:

如上文所述,当我要查找的元素在列表中多次出现,我用index进行查找的时候,只能返回第一次出现的位置的索引,但我一次性知道全部位置,有没有什么办法呢?这时候就要有请我们的enumerate函数闪亮登场啦。
先简单的介绍一下enumerate,enumerate就是枚举、列举的意思。它可以将列表元素索引和列表元素打包成一个个元组然后再将其一一列举出来。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
print(enumerate(list1))

# 程序输出:
# <enumerate object at 0x0000018660435440>
list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
print(list(enumerate(list1)))

# 程序输出:
# [(0, 7), (1, 8), (2, 9), (3, 2), (4, 6), (5, 2), (6, 1), (7, 8), (8, 9)]

从上面两段代码,我们可以看到,如果你直接enumerate(),那么程序只会返回一个enumerate对象。而如果你利用list()的话,程序会将列表中所有元素按照(元素索引,元素)的格式打包成一个列表,再将其输出。
那么,我们怎样利用enumerate去查找元素呢?

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
print([i for i, x in enumerate(list1) if x == 2])

# 程序输出:
# [3, 5]

而且,利用enumerate不仅可以输出你要查找的元素的所有索引,而且还可以输出你自定义的顺序,这也是enumerate的高级之处。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
print(list(enumerate(list1, 4)))

# 程序输出:
# [(4, 7), (5, 8), (6, 9), (7, 2), (8, 6), (9, 2), (10, 1), (11, 8), (12, 9)]

enumerate其实有两个参数,第一个参数是输入你要处理的迭代器,在这里其实就是列表,不过它还可以输入一个字符串,元组什么的,不过这在这里就不展开讲了;然后第二个参数是传入一个数字,然后enumerate将会以这个数字作为迭代器的第一个元素(在这里就是列表的第一个元素)的顺序(类似于索引)来往下排序。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
print([i for i, x in enumerate(list1, 4) if x == 2])

# 程序输出:
# [7, 9]

那么,enumerate有什么特点呢?
1.可以将你要查找的元素在列表中的所有索引位置都找出来
2.索引的顺序也是从左往右
3.可以输出自定义的顺序
看了上文index和enumerate的介绍之后,我们就会发现输出的都是从左往右排序的索引值,那可以输出从右往左排的索引值吗?当然可以,不过好像没有专门的函数来处理(我找了很久也找不到,不过也可能是因为我知识缺乏,所以不知道,如果有哪位大佬知道,还请大佬告诉我,谢谢)。没有专门的函数来处理,但是我又说可以获得,这是怎么回事呢?这就需要我们利用for循环或者自己构造一个函数了,不过这个很少需要去获得从右往左的索引(反正我到现在都没有遇到过,有可能是因为我写的代码少),所以这里就不展开讲了。

2.索引的作用

索引有什么作用呢?
常用的有三种用法:
1.如上面所示,可以用来查找元素位置
2.切片(下面会讲)
3.获取某个值

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[5]
print(x)

# 程序输出:
# 2

利用索引,可以获取列表某个位置上的值。

3.切片

什么是切片呢?顾名思义,切片其实就是将列表中的某一段切出来,然后组成新的一个列表。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[1:5:1]
print(x)

# 程序输出:
# [8, 9, 2, 6]

切片的实行其实就是利用一个中括号来将我们要的部分切出来。在中括号中有三个参数,第一个参数是起始位置的索引,第二个参数是终止位置的索引(但并没有将终止位置的值给切出来,因为切片也是左闭右开区间),第三个参数是步长,就是你要每几个元素切一次。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[1:5:2]
print(x)

# 程序输出:
# [8, 2]

就像上面的代码一样,如果步长为2,那程序就会从起始位置开始切,每两个元素切出一个,一直切到终止位置的前一个数为止。
当步长为1时,我们一般会省略不写。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[1:5]
print(x)

# 程序输出:
# [8, 9, 2, 6]

其实第二个参数也可以省略不写,当第二个参数省略不写的时候,就代表要一直切到列表结束。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[1:]
print(x)

# 程序输出:
# [8, 9, 2, 6, 2, 1, 8, 9]
list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[1::2]
print(x)

# 程序输出:
# [8, 2, 2, 8]

看到这,应该会很多人会思考,那我第二个和第三个参数都可以省略,那我第一个参数是不是也可以省略呢?没错,第一个参数也可以省略。当第一个参数被省略时,切片就会默认从第一个元素开始切。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[:7]
print(x)

# 程序输出:
# [7, 8, 9, 2, 6, 2, 1]

这时候,可能就会有人在思考,如果我三个参数都省略了呢?没错,正如你心中所想的,会输出整个列表。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[:]
print(x)

# 程序输出:
# [7, 8, 9, 2, 6, 2, 1, 8, 9]

不知道大家有没有想过,如果起始位置在终止位置的右边会发生什么呢?是会报错呢,还是会发生什么呢?试一下不就知道了。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[3:1]
print(x)

# 程序输出:
# []

天哪!程序居然没有报错,而是输出了一个空列表。
那如果,我的步长是0呢?

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[1:3:0]
print(x)

# 程序输出:
# ValueError: slice step cannot be zero

很遗憾,报错了。看来,步长不能为0,那步长可以为负吗?

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[1:3:-1]
print(x)

# 程序输出:
# []

什么?居然没有报错,而是又一次输出空列表。那说明代码没有错,那怎样才不会输出空列表呢?
如果,我把起始位置和终止位置调换,会怎么样呢?

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[3:1:-1]
print(x)

# 程序输出:
# [2, 9]

天哪,居然输出一个列表了。而且列表是从右往左开始切的,所以,说明步长为正的时候,从左往右开始切,步长为负的时候,从右往左开始切。
不知道,这时候大家有没有想到什么?没错,我们上面才刚讲过,元素从右往左排序的索引是从-1开始的。如果我们可不可以利用从右往左的索引来切片呢?

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[-1:-3:-1]
print(x)

# 程序输出:
# [9, 8]

没错,正如我们所料,是可以的。
那如果步长是-2会怎么样呢?想必大家心中已经有答案了吧。

list1 = [7, 8, 9, 2, 6, 2, 1, 8, 9]
x = list1[-1:-5:-2]
print(x)

# 程序输出:
# [9, 1]

不知道你猜对了吗。没错,步长的绝对值代表每多少个数切一次,正负代表切片方向。
行啦,切片到这里就讲完了。现在来总结一下吧。
切片的特点:
1.输入的三个参数是通过冒号隔开的,第三个参数,即步长省略时,步长前面的冒号也要省略,但第一和第二个参数省略时,两者之间的冒号不可以省略。
2.步长的绝对值代表每多少个数切一次,步长的正负代表切片方向。步长不能为0。
3.当步长为正的时候,起始位置的索引要在终止位置的索引的左边;当步长为负的时候,起始位置的索引要在终止位置的右边,不然的话,程序会输出空列表。

四.列表如何添加数据

既然说列表是一个存放数据的集合,那它里面就应该有数据,那么我们创建完一个空列表之后,我们怎么往列表中添加数据呢?

1.列表相加法

接触过python的朋友应该都知道,python里的加法是支持同中数据相加的,所以,同样的,python中的加法也支持列表相加。

list1 = [1, 2, 3, 4]
list2 = ['臣', [1, 2], 5]
list1 += list2
print(list1)

# 程序输出:
# [1, 2, 3, 4, '臣', [1, 2], 5]
2.append

那用加法来增加元素看起来好low哦,有没有什么办法看起来更高级一点呢?当然有。

list1 = [1, 2, 3, 4]
list1.append('成功添加元素')
print(list1)

# 程序输出:
# [1, 2, 3, 4, '成功添加元素']

那么append有什么特点呢?
1.一次只能添加一个元素,所以如果要添加多个元素,常可与for循环连用;
2.append添加的元素只能出现在列表的最后一位;
3.可以添加任何数据类型的列表。

3.extend

append一次只能添加一个元素,那我如果一次想要添加多个元素,但我又不想用for循环怎么办?那这时候你就只能用extend了。

list1 = [1, 2, 3, 4]
list1.extend([5, 6])
print(list1)

# 程序输出:
# [1, 2, 3, 4, 5, 6]

那么,extend有什么特点呢?
1.一次即可以添加一个元素,也可以添加多个元素
2.只接受一个列表作为参数,并把作为参数的列表中的各项元素一起添加进去(如果向append传入一个列表作为参数,那append只会将整个列表作为一个整体添加进去)
3.extend添加的元素只能出现在列表的最后一位

结束语

行了,今天的分享就先到这里吧
其实添加元素不止这三种办法,还有其他的,而且元素可以添加也就可以删除,这些在下期将会继续向大家一一分享。
如果哪位大佬发现哪里写错了,还请批评指正。
最后,希望各位伙伴能点个赞,给我个鼓励,谢谢

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值