当前位置: 首页 > news >正文

Python-列表,从基础到进阶用法大总结,进来查漏补缺

在这里插入图片描述
B站|公众号:啥都会一点的研究生

hello,我是啥都生,本期将Python中列表涉及的从基础到进阶用法,全部总结归纳,一起看看吧

首先讲讲列表的创建,定义空列表可以使用如下两种方式

list1 = []
list2 = list()

print(list1, list2)

>>> [] []

在中括号内输入元素即完成了非空列表的创建,由逗号隔开不同元素

list1 = ["a", "b", "c"]
list2 = [1, 2, 3]
list3 = [True, False]

print(list1)
print(list2)
print(list3)

>>> ['a', 'b', 'c']
>>> [1, 2, 3]
>>> [True, False]

需要注意的是,列表中的元素可以重复,可以是不同类型

list1 = [1, 1, 1]
list2 = ['a', 'a', 'a']
list3 = ['a', True, 250]

print(list1)
print(list2)
print(list3)

>>> [1, 1, 1]
>>> ['a', 'a', 'a']
>>> ['a', True, 250]

如果想初始化n个相同元素的列表,无需手敲,可以直接使用如下便捷方式

list1 = [5] * 10

print(list1)

>>> [5, 5, 5, 5, 5, 5, 5, 5, 5, 5]

该操作也同样适用于不同维度列表,但一般多维数组有其他更强大的库代替,此时应该有同学站起来抢答Numpy

list1 = [1, 2, 3] * 2
list2 = [[1, 1], [2, 2]] * 2

print(list1)
print(list2)

>>> [1, 2, 3, 1, 2, 3]
>>> [[1, 1], [2, 2], [1, 1], [2, 2]]

使用list结合range完成列表的创建是使用频率相当高的一种方式

list1 = list(range(10))

print(list1)

>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

需要注意的是,如果使用list结合字符串,输出会变成如下形式

list1 = list("Hi bilibili")

print(list1)

>>> ['H', 'i', ' ', 'b', 'i', 'l', 'i', 'b', 'i', 'l', 'i']

列表中嵌套列表,完成多层级矩阵创建,且子列表无需保持长度一致

list1 = [[1, 1], [2, 2]]
list2 = [[1], [2, 2], [3, 3, 3]]

print(list1)
print(list2)

>>> [[1, 1], [2, 2]]
>>> [[1], [2, 2], [3, 3, 3]]

讲完了创建,再来讲讲索引,使用正数表示从左至右取元素值,从0开始表示最左边元素,以此类推,即最右边元素为列表长度减一

list1 = [1, 2, 3, 4, 5]

first = list1[0]
last = list1[5-1]
print(first, last)

>>> 1 5

同样可以使用负数表示从右至左取值,但注意此时从-1开始表示最右边元素

list1 = [1, 2, 3, 4, 5]

first = list1[-1]
last = list1[-5]
print(first, last)

>>> 5 1

如果索引超出范围[0, length(list)-1],则会抛出IndexError

list1 = [1, 2, 3, 4, 5]

data = list1[5]

>>> Traceback (most recent call last):
  File "script.py", line 5, in <module>
    data = list1[5]
IndexError: list index out of range

Exited with error status 1

修改相应位置元素可以在取出索引时直接赋值

list1 = [1, 2, 3, 4, 5]

list1[0] = 0
print(list1)

>>> [0, 2, 3, 4, 5]

搭配冒号:可以实现更多索引切片玩法,取列表中某一段元素值使用如下方式,注意左闭右开,seg1表示取从左至右第一个元素至第三个元素,seg2表示取从左至右第三个元素至第五个元素

list1 = [1, 2, 3, 4, 5]

seg1 = list1[0:3]
seg2 = list1[2:5]
print(seg1, seg2)

>>> [1, 2, 3] [3, 4, 5]

而该例子通常会写成如下形式

list1 = [1, 2, 3, 4, 5]

seg1 = list1[:3] # 适用于从初始位置开始的切片
seg2 = list1[2:] # 适用于以末尾位置结束的切片
print(seg1, seg2)

>>> [1, 2, 3] [3, 4, 5]

同样的适用于负数,但通常不这么做,也不建议这样

list1 = [1, 2, 3, 4, 5]

seg1 = list1[-3:-1]

print(seg1)

>>> [3, 4]

使用双冒号::实现隔值索引,该例表示从左开始每两个位置取值

list1 = list(range(20))

seg1 = list1[::2]

print(seg1)

>>> [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

同样适用于负数,值得一提的是,双冒号搭配-1起到列表翻转的作用

list1 = list(range(20))

seg1 = list1[::-1]

print(seg1)

>>> [19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

对于列表某段元素,也支持全部重新赋值

list1 = [1, 2, 3, 4, 5, 6]

list1[:3] = 'a', 'b', 'c'
list1[3:] = 'abc'

print(list1)

>>> ['a', 'b', 'c', 'a', 'b', 'c']

然后再来讲讲列表元素的增加,使用append实现列队尾元素直接插入,效率高

list1 = [1, 2, 3, 4, 5]

list1.append(6)

print(list1)

>>> [1, 2, 3, 4, 5, 6]

也支持多元素插入

list1 = [1, 2, 3, 4, 5]

list1.append([6, 7, 8])

print(list1)

>>> [1, 2, 3, 4, 5, [6, 7, 8]]

使用insert实现各位置任意插入,如在索引为2的位置插入88,但insert方法会带来列表移动,效率低,非必要尽量不用

list1 = [1, 2, 3, 4, 5]

list1.insert(2,88) # 在索引为2的位置插入88

print(list1)

>>> [1, 2, 88, 3, 4, 5]

使用extend方法实现列表的拼接,比如前述append例子想在末尾插入多个元素,而结果却是嵌套列表,此时extend就派上用场

list1 = [1, 2, 3, 4, 5]

list1.extend([6, 7, 8])

print(list1)

>>> [1, 2, 3, 4, 5, 6, 7, 8]

同样的,也可使用+号完成拼接,但该方式效率低,建议使用内置函数appendextend

list1 = [1, 2, 3, 4, 5]

list1 += [6, 7, 8]

print(list1)

>>> [1, 2, 3, 4, 5, 6, 7, 8]

讲完增加,再讲删除,使用del实现根据索引值删除元素

list1 = [1, 2, 3, 4, 5]

del list1[0]

print(list1)

>>> [2, 3, 4, 5]

也可以直接删除整个列表

list1 = [1, 2, 3, 4, 5]

del list1

print(list1)

>>> Traceback (most recent call last):
  File "script.py", line 7, in <module>
    print(list1)
NameError: name 'list1' is not defined

Exited with error status 1

使用pop删除指定索引位置元素,若未指定,默认删除最后一个元素

list1 = [1, 2, 3, 4, 5]

list1.pop()

print(list1)

list1.pop(0)

print(list1)

>>> [1, 2, 3, 4]
>>> [2, 3, 4]

使用remove删除指定元素值,通常在不确定索引只确定值的情况下使用

list1 = [1, 2, 3, 4, 5]

list1.remove(4)

print(list1)

>>> [1, 2, 3, 5]

特别注意,remove方法只删除第一个匹配的元素

list1 = [1, 2, 3, 3, 5]

list1.remove(3)

print(list1)

>>> [1, 2, 3, 5]

此外,若列表中不存在该指定值会引发 ValueError 错误

list1 = [1, 2, 3, 3, 5]

list1.remove(4)

print(list1)

>>> Traceback (most recent call last):
  File "script.py", line 5, in <module>
    list1.remove(4)
ValueError: list.remove(x): x not in list

Exited with error status 1

使用clear清空列表内容,而保留列表本身,这点与前述del有所区别,通常用于循环结构中,无需额外创建新列表,节省资源

list1 = [1, 2, 3, 4, 5]

list1.clear()

print(list1)

>>> []

讲完了增加与删除,还有其他方法,使用index返回某元素在列表中的位置索引,若出现多次,则返回第一次出现的位置索引

list1 = [1, 2, 3, 4, 5]

idx = list1.index(4)

print(idx)

>>> 3

使用count统计列表中某元素出现次数

list1 = [1, 4, 4, 4, 5]

num = list1.count(4)

print(num)

>>> 3

使用sort完成列表排序

list1 = [-1, -5, 4, 2, 5]

list1.sort()

print(list1)

list1.sort(reverse=True)

print(list1)

>>> [-5, -1, 2, 4, 5]
>>> [5, 4, 2, -1, -5]

使用reverse完成列表反转

list1 = [1, 2, 3, 4, 5]

list1.reverse()

print(list1)

>>> [5, 4, 3, 2, 1]

需特别注意的是,clear(), insert(), sort(), reverse(), remove(), extend(), append()是无返回值的,很容易出错写成如下形式

list1 = [1, 2, 3, 4, 5]

list1 = list1.append(6)

print(list1)

>>> None

再是Python支持的用于列表的内置方法,使用len返回列表长度

list1 = [1, 2, 3, 4, 5]

num = len(list1)

print(num)

>>> 5

使用min返回列表中最小元素

list1 = [1, 2, 3, 4, 5]

data = min(list1)

print(data)

>>> 1

使用max返回列表中最大元素

list1 = [1, 2, 3, 4, 5]

data = max(list1)

print(data)

>>> 5

然后说说列表的拷贝,如下展示的是错误的拷贝方式,打印会发现原始数据得到了改变

list1 = [1, 2, 3, 4, 5]

list2 = list1

list2.pop()

print(list1, list2)

>>> [1, 2, 3, 4] [1, 2, 3, 4]

可以使用列表推导式进行拷贝

list1 = [1, 2, 3, 4, 5]

list2 = [i for i in list1]

list2.pop()

print(list1, list2)

>>> [1, 2, 3, 4, 5] [1, 2, 3, 4]

也可以使用内置函数copy进行拷贝

list1 = [1, 2, 3, 4, 5]

list2 = list1.copy()

list2.pop()

print(list1, list2)

>>> [1, 2, 3, 4, 5] [1, 2, 3, 4]

再就是列表的解包,比如这个例子,如果你使用这种方式

list1 = [1, 2, 3]

first = list1[0]
second = list1[1]
third = list1[2]

print(first, second, third)

>>> 1 2 3

就会显得很小白,可以直接这样

list1 = [1, 2, 3]

first, second, third = list1

print(first, second, third)

>>> 1 2 3

接下来是重点,如果列表元素过多,而仅需要前几位,可以这样

list1 = list(range(20))

first, second, *other = list1

print(first, second)
print(other)

>>> 0 1
>>> [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

你以为这就完事了吗,还可以这样

list1 = list(range(20))

first, *other, last = list1

print(first, last)
print(other)

>>> 0 19
>>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]

这样

list1 = list(range(20))

*other, penultimate, last = list1

print(penultimate, last)
print(other)

>>> 18 19
>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17]

再说说列表的遍历,通常使用for循环直接遍历列表

list1 = ["one", "two", "three"]

for i in list1:
    print(i)

>>> one
two
three

如果需要用到位置索引,更好的方式是使用enumerate

list1 = ["one", "two", "three"]

for data in enumerate(list1):
    print(data)

>>> (0, 'one')
(1, 'two')
(2, 'three')

也就是说enumerate每次返回打包好的相应元素及其位置索引,前述才讲解完解包,可理解为返回的data如下

list1 = ["one", "two", "three"]

# for data in enumerate(list1):
#     print(data)
data = [0, "one"]
index, item = data

所以通常写成如下形式

list1 = ["one", "two", "three"]

for index, item in enumerate(list1):
    print(index, item)

>>> 0 one
1 two
2 three

如果要判断某元素是否存在于列表中,可以使用如下简单方式

list1 = ["one", "two", "three"]

if "two" in list1:
    print(True)

>>> True

最后,关于列表推导式,举三个例子,掌握后即可用于绝大部分场景,第一个,目的是想构造一个新列表,而列表中的元素为原先的4两倍

list1 = [1, 2, 3, 4, 5, 6]
list2 = []

for item in list1:
        list2.append(item * 2)
print(list2)

>>> [2, 4, 6, 8, 10, 12]

而使用列表推导式可以写成如下形式

list1 = [1, 2, 3, 4, 5, 6]
list2 = [i * 2 for i in list1]

print(list2)
>>> [2, 4, 6, 8, 10, 12]

第二个例子,程序的目的是过滤列表中的偶数

list1 = [1, 2, 3, 4, 5, 6]
list2 = []

for item in list1:
    if item % 2 == 1:
        list2.append(item)
print(list2)

>>> [1, 3, 5]

使用列表推导式则写成如下形式

list1 = [1, 2, 3, 4, 5, 6]
list2 = [i for i in list1 if i % 2 == 1]

print(list2)
>>> [1, 3, 5]

第三个,程序的目的是将两个列表中的元素进行打包

list1 = [1, 2, 3, 4]
list2 = ["a", "b", "c", "d"]
list3 = []

for item1 in list1:
    for item2 in list2:
        list3.append((item1, item2))
print(list3)

>>> [(1, 'a'), (1, 'b'), (1, 'c'), (1, 'd'), (2, 'a'), (2, 'b'), (2, 'c'), (2, 'd'), (3, 'a'), (3, 'b'), (3, 'c'), (3, 'd'), (4, 'a'), (4, 'b'), (4, 'c'), (4, 'd')]

改写成列表推导式如下

list1 = [1, 2, 3, 4]
list2 = ["a", "b", "c", "d"]
list3 = [(item1, item2) for item1 in list1 for item2 in list2]

print(list3)

>>> [(1, 'a'), (1, 'b'), (1, 'c'), (1, 'd'), (2, 'a'), (2, 'b'), (2, 'c'), (2, 'd'), (3, 'a'), (3, 'b'), (3, 'c'), (3, 'd'), (4, 'a'), (4, 'b'), (4, 'c'), (4, 'd')]

以上就是本期的全部内容,欢迎纠错与补充,整理不易,点赞收藏关注鼓励下吧,一起进步~

相关文章:

  • JDBC模拟SQL注入和避免SQL注入
  • flink在企业IT架构中如何定位-在选型流批一体技术与大数据架构时的避坑指南
  • JUC并发编程之CompletableFuture基础用法
  • SpringBoot+Mybatis-Plus多数据源使用
  • Colab-免费GPU算力
  • 【CH559L单片机】串口下载程序说明
  • CMake中macro的使用
  • windows利用msys2安装minGW64
  • (42)STM32——LCD显示屏实验笔记
  • 全国青少年软件编程等级考试标准Python(1-6级)
  • Java语法基本概念
  • 一文搞懂CSS盒子模型
  • 【PAT甲级】1123 Is It a Complete AVL Tree
  • PWM实验(控制蜂鸣器,风扇,马达)
  • MySQL 从入门到入狱 rm - rf /* 咳咳~ 到精通
  • 分享的文章《人生如棋》
  • avalon2.2的VM生成过程
  • C++类中的特殊成员函数
  • ESLint简单操作
  • Java到底能干嘛?
  • Java基本数据类型之Number
  • maven工程打包jar以及java jar命令的classpath使用
  • nodejs:开发并发布一个nodejs包
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • use Google search engine
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 简单数学运算程序(不定期更新)
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 译米田引理
  • 在weex里面使用chart图表
  • elasticsearch-head插件安装
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • 整理一些计算机基础知识!
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (2)STM32单片机上位机
  • (30)数组元素和与数字和的绝对差
  • (4)Elastix图像配准:3D图像
  • (8)STL算法之替换
  • (MATLAB)第五章-矩阵运算
  • (分布式缓存)Redis哨兵
  • (九)One-Wire总线-DS18B20
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (转)memcache、redis缓存
  • (转)socket Aio demo
  • .equals()到底是什么意思?
  • .Net Core与存储过程(一)
  • .Net 路由处理厉害了
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET建议使用的大小写命名原则
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • [.net] 如何在mail的加入正文显示图片
  • [2023-年度总结]凡是过往,皆为序章
  • [asp.net core]project.json(2)
  • [BUUCTF]-PWN:wustctf2020_number_game解析(补码,整数漏洞)