Python数据结构——列表

news2024/11/17 5:50:39

目录

一、认识Python数据结构

二、列表概述

三、列表切片

(一)概述

(二)常见形式

(三)特别说明

四、列表的基本操作

(一)创建列表

(二)列表元素增加

(三)列表元素删除

(四)列表元素修改

(五)列表元素查找

五、与列表相关的其他常见函数

六、列表内建函数

七、列表推导式(list comprehensions)


一、认识Python数据结构

        Python有4个内建的数据结构,它们可以统称为容器(container),因为它们实际上是一些“东西”组合而成的结构,而这些“东西”,可以是数字、字符甚至列表,或是它们的组合。

1、可变数据类型
        可以直接对数据结构对象进行元素的赋值修改、删除或增加等操作。修改后的新结果仍与原对象引用同一个id地址值,即由始至终只对同一个对象进行了操作。

2、不可变数据类型
        不能对数据结构对象的内容进行修改操作(对对象当中的元素进行增加、删除和赋值改)。试图强行修改的结果会导致变量名引用一个新对象而不会改变原对象(新旧对象两者是引用两个不同的id地址值)。

s='I like Python'
id(s)
t='too'
s+=t
id(s)

二、列表概述

列表中的元素是有序的,元素可以是任何类型,而且允许重复;
列表属于可变数据类型,允许直接对列表对象进行增、删、改操作。

all_list1 = [1,'word',{'like':'python'},True,[1,2]]

因为是有序的,其元素通过索引(下标)来访问,索引的作用:取单个元素
可以从左到右(正向)索引,也可以从右到左(反向)索引

1、正向:第一个元素的索引为0,最后一个元素的索引为len(all_list1)-1

print(all_list1[0], all_list1[len(all_list1)-1])

2、反向:第一个元素(正向的最后一个元素)的索引为-1,第二个元素(正向的倒数第二个元素)的索引为-2

print(all_list1[-1], all_list1[-2])


3、当索引越界时会报错:提示IndexError: list index out of range

print(all_list1[-6])

4、根据列表内容查找索引,可以使用index()方法或find()方法:

print(all_list1.index('word'))

index()方法或find()方法的区别:找不到时前者会出错,后者会返回-1

如何访问嵌套列表中的元素?
答:使用多维索引,例如:all_list1[4][1]将指向整数对象2,
all_list1[4]指向的是列表对象[1,2]
而all_list1指向的是上面整个列表对象

三、列表切片

(一)概述

切片的作用:取列表中的0到多个元素,形成子列表
语法:sequence_name[start:end:step]
注意:取元素规则是左闭右开区间,不包含end。当step为1时,提取元素个数: (end-start)。

1、当step为正时,切片方向是从左到右,正常是要求start小于end

s='I like Python'
s[2:9:2]
s[2:-4:2]
s[-11:-4:2]

 

2、当step为负时,切片方向是从右向左,正常是要求start大于end

s='I like Python'
s[9:2:-2]
s[-4:2:-2]
s[9:-11:-2]
s[-4:-11:-2]

注意下面两个的区别:

s[7:]
s[7:-1]

(二)常见形式

all_list1 = [1,'word',{'like':'python'},True,[1,2]]

all_list1[2:4]    #省略step,step默认为1,提取索引为2和3的两个元素

all_list1[2:]    #省略end和step,提取从索引2开始的全部后面元素,包含最后一个元素

all_list1[2:-1]    #提取从索引2开始的后面元素,但不包含最后一个元素

all_list1[:]    #省略start,默认从0开始,提取所有元素

all_list1[::-1]    #逆序整个列表

newList=all_list1[:]    #复制整个all_list列表

id(all_list1)
id(newList)

注意:
切片不会改变原始列表,而是会产生一个新的列表对象!
这与Numpy中的数组切片不同,后者得到的原数组对象的一个视图,修改切片中的内容会导致修改原来的数组对象!

(三)特别说明

1、step为正:
表示提取方向是从左到右,正常情况是要求start小于end。
如果start或end超出索引的范围,或者start大于或等于end,则切片操作将会返回的是空列表,例如:all_list1[6:8]或all_list1[3:3]

2、step为负:
表示提取方向是从右到左,正常情况是要求start大于end。
如果start或end超出索引的范围,或者start小于或等于end,则切片操作将会返回的是空列表。

四、列表的基本操作

(一)创建列表

1、方法一:使用[ ]创建,列表元素间以逗号隔开

empty1 = []   #空列表
all_list1 = [1,'word',{'like':'python'},True,[1,2]]

2、方法二:使用list()函数创建,可以把其他非列表类型的对象转换为列表类型
注意: list()函数只允许有一个参数

empty2 = list()     #空列表
lstr = list(“student”)    #lstr指向列表['s', 't', 'u', 'd', 'e', 'n', 't']

(二)列表元素增加

fruit = [1,'word',True,'pear']

month=['January','February']

1、append()方法

(1)在末尾只能追加一个元素
(2)被增加的元素可以是任何类型的对象

示例:

fruit = [1,'word',True,'pear']
month=['January','February']
fruit.append(month)    #month列表作为一个元素被追加到尾部
print(fruit)

2、extend()方法

(1)在末尾合并一个可迭代对象,因此可以一次性在末尾合并吸收一个或多个元素
(2)被合并的对象必须是一个可迭代对象

示例:

fruit = [1,'word',True,'pear'] 
month=['January','February']
fruit.extend(month)    #month列表被合并到fruit的尾部,相当于fruit+=month
print(fruit)

错误示例:fruit.extend(5)  //整数5不是一个可迭代对象

3、insert()方法

一般用于在中间的某个指定位置(索引)插入一个新元素(两参数分别是索引和新元素)

示例:

fruit = [1,'word',True,'pear'] 
month=['January','February']
fruit.insert(-3,'apple')
fruit.insert(9,month)
print(fruit)

(三)列表元素删除

fruit = [1,'word',True,'pear']

1、del关键字

既可以删除整个列表对象,也可以按索引(位置)删除特定元素。

示例一:

fruit = [1,'word',True,'pear']
del fruit[0:2]    #允许按切片形式进行删除,但不会返回被删除的元素
print(fruit)

示例二:

fruit = [1,'word',True,'pear']
del fruit     #删除整个列表对象
print(fruit)

 列表对象fruit已被删除,故报错“name 'fruit' is not defined”。

2、pop(index)方法

删除index给出的列表指定位置元素的同时,还可以返回被删除的元素值。

示例:

fruit = [1,'word',True,'pear']
temp = fruit.pop(2)     #pop删除能返回被删除的元素
print(fruit)

当没有index参数时,默认删除列表的最后一个元素。

3、remove()方法

与前面两个按位置删除不同,它按元素值删除(删除第1个匹配项),找不到删除项则报错。

示例:

fruit = [1,'word',True,'pear']
fruit.remove('pear')
print(fruit)

4、clear()方法

清空整个列表(使之成为空列表,但不删除列表对象)

示例:

fruit = [1,'word',True,'pear']
fruit.clear()
print(fruit)

(四)列表元素修改

对列表的索引/切片赋值

fruit = [1,'word',True,'pear']
fruit[0] = ‘orange’
print(fruit)

 

(五)列表元素查找

fruit = [1,'word',True,'pear']
fruit[3]     #按索引找元素
fruit.index(‘pear’)     #按元素找索引也可以使用find()方法

五、与列表相关的其他常见函数

all_list = [1,2,'hello','word']

长度:len(all_list)
计数:all_list.count(‘word’)     //统计元素’word’出现的次数
反转:all_list[::-1] 或者 all_list.reverse()或者reversed(list)
合并:list1+list2(注意:list1.extend(list2)相当于list1+=list2)
重复:all_list * 2 (例如:

all_list = [1,2,'hello','word']
all_list * 2

返回列表元素(数值型)的最大、最小值:max(list)、 min(list)
判断元素是否存在:'word' in all_list(注意:与 in 相反的运算符是 not in)
排序:(1)list.sort()函数会改变列表对象本身;
           (2)sorted(list)全局方法不会改变列表对象本身,却会产生一个排好序的新列表对象。

注意:
ls.sort(reverse=True)表示排序时按降序排列,它与反转元素顺序的ls.reverse()方法的作用是不同的。

六、列表内建函数

web = 'www.jou.edu.cn'
str1 = web.split('.')
str1

str1.sort()    #默认按首字母升序
str1

str1.sort(key=len,reverse=True)    #当指定关键字为长度len,并且reverse=True时,将按长度大小降序排列
str1

all_list1 = list((1,'word',{'like':'python'},True,[1,2]))
list3=list(enumerate(all_list1))
print(list3)

七、列表推导式(list comprehensions)

Python推导式(又称解析式)允许以简洁的方式从一个可迭代对象构建出一个新的数据结构,共有三种推导:列表推导式(构建出列表)、字典推导式(构建出字典)和集合推导式(构建出集合)

列表推导式的基本语法为:

1、不带条件的列表推导式:[表达式 for 变量 in 可迭代对象] 
2、带条件的列表推导式,又分为
(1)单分支:[表达式 for 变量 in 可迭代对象 if 条件]
(2)双分支:[表达式1 if 条件 else 表达式2 for 变量 in 可迭代对象]

list1 = [i**2 for i in range(1,11)]
print(list1)
print([i for i, x in enumerate(list1) if x%3 ==0])

list2 = [1 if x%3 == 0 else 0 for x in list1]
print(list2)

3、列表推导式的嵌套:[for 变量1 in 可迭代对象1 if 条件1 for 变量2 in 可迭代对象2 if 条件2]

list3 = [(x,y) for x in range(5) if x%2 == 0 for y in range(5) if y%2 == 1]
print(list3)

列表推导式有助于简化for循环的写法!

data = [num for num in range(20) if num%2==1]

等价于

data = []
for num in range(20):
    if num%2 == 1:
        data.append(num)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1390585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

宿舍管理系统的设计与实现:基于Spring Boot、Java、Vue.js和MySQL的完整解决方案

✍✍计算机编程指导师 ⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流! ⚡⚡ Java实战 |…

GMP模型学习笔记:概念、流程概述、设计机制及部分场景

前言 Go是并发而生的语言,其中则通过GMP模型来进行协程的分配与调度。本篇将记录自己学习GMP模型的笔记。 进程、线程、协程分配流程概述 计算机发展之初,是只有进程的。那时候是单进程时代,多个进程顺序执行,计算机也没有并发…

sentinel熔断与限流

文章目录 一、sentinel简介Sentinel 是什么?Sentinel安装 二、sentinel整合工程新建cloudalibaba-sentinel-service8401微服务引入依赖yml配置主启动类添加EnableDiscoveryClient业务类测试 三、sentinel流控规则基本介绍流控模式直接(默认)关…

在pycharm远程连接树莓派遇到的No files or folders found to process处理办法

在PyCharm中解决"No files or folders found to process"错误的另一个方法是通过Deployment中的Configuration选项。在PyCharm中,找到Tool并选择Deployment,然后点击Configuration。 在设置路径的过程中需要注意目标目录是相对的 在中 会识…

DNS从入门到精通

DNS从入门到精通 Dns从入门到精通 DNS从入门到精通一、DNS原理二、企业高速缓存dns的搭建三、DNS相关名词解释四、权威DNS搭建编辑子配置文件(主要写我们维护的域zone)开始解析 五、权威dns中的数据记录种类及应用编辑子配置文件(主要写我们维护的域zone…

微信小程序canvas画布图片保存到相册官方授权、自定义授权、保存

关键步骤介绍 wx.getSetting可以获取授权信息。 wx.authorize首次授权时会打开弹框让用户授权,若用户已选择同意或拒绝,后续不会再显示授权弹框。 如果授权信息显示未进行相册授权,则打开自定义弹框(show_auth: true&#xff0…

自定义C#类库(.dll文件)

环境配置 操作系统:Windows 10 开发工具:Visual Studio 2022 .Net桌面开发环境: 开发步骤 (一)创建C#类库项目 (二)配置项目名称和项目路径 (三)选择所使用的框架&a…

群晖NAS上安装部署开源工作流自动化工具n8n

一、开源工作流自动化工具n8n简介 n8n是它是一个与其他应用集成的应用程序,目标是自动化各应用之间的流程;利用 n8n 你可以方便地实现当 A 条件发生,触发 B 服务这样的自动工作流程。 n8n优点是:代码开源、可以自托管、下载安装方便、易于使用…

快速入门Java NIO(Not I/O)的网络通信框架--Netty

Netty 入门 了解netty前需要对nio有一定认识,该笔记基础来自bilinbili黑马,在此基础上自己学习的笔记,添加了一些自己的理解 了解java 非阻塞io编程 1. 概述 1.1 Netty 是什么? Netty is an asynchronous event-driven network application framework for rapid …

PLC绝对定位指令DDRVA往复运动(三菱FX系列简单状态机编程)

有关状态机的具体介绍,专栏有很多文章,大家可以通过下面的链接查看: https://rxxw-control.blog.csdn.net/article/details/125488089https://rxxw-control.blog.csdn.net/article/details/125488089三菱FX系列回原功能块介绍 https://rxxw-control.blog.csdn.net/article…

2024年【上海市安全员B证】模拟考试及上海市安全员B证复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 上海市安全员B证模拟考试是安全生产模拟考试一点通生成的,上海市安全员B证证模拟考试题库是根据上海市安全员B证最新版教材汇编出上海市安全员B证仿真模拟考试。2024年【上海市安全员B证】模拟考试及上海市…

网络安全(网络安全)—2024自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高; 二、则是发展相对成熟…

TCP 的三次握手和四次挥手

Java 面试题 TCP 三次握手 第一次握手:客户端向服务端发送SYN包。报文中标志位SYN1,序列号seqx(x为随机整数)。此时客户端进入了 SYN_SEND 同步已发送状态。 第二次握手:服务端回复客户端SYNACK包。报文中标志位SYN1&…

Mantle: A Programmable Metadata Load Balancer for the Ceph File System——论文泛读

SC 2015 Paper 元数据论文阅读汇总 问题 优化Ceph的元数据局部性和负载平衡。 现有方法 提高元数据服务性能的最常见技术是在专用的元数据服务器(MDS)节点之间平衡负载 [16, 25, 26, 21, 28]。常见的方法是鼓励独立增长并减少通信,使用诸…

burp靶场——XXE注入

XML 外部实体 (XXE) 注入 1. 什么是xxe漏洞: https://portswigger.net/web-security/xxe#what-is-xml-external-entity-injection XML 外部实体注入(也称为 XXE)是一种 Web 安全漏洞,允许攻击者干扰应用程序对 XML 数据的处理。…

无监督去噪的一个变迁(1)——N2N→N2V→HQ-SSL

目录 1. 前沿2. N2N3. N2V——盲点网络(BSNs,Blind Spot Networks)开创者3.1. N2V实际是如何训练的? 4. HQ-SSL——认为N2V效率不够高4.1. HQ-SSL的理论架构4.1.1. 对卷积的改进4.1.2. 对下采样的改进4.1.3. 比N2V好在哪&#xff…

【Linux】权限详解

权限是什么呢? 通过一定条件,拦住一部分人,给另一部分人权利来访问某种资源 权限的本质: 权限与人有关:比如你要进你的学校是要看你是个人吗,重要的是看的是你是不是学校内学生,即你的角色 当然…

力扣精选算法100题——等于目标值的两个数or三数之和(双指针专题)

目录 🚩等于目标值的俩个数 第一步:了解题意 第二步:算法原理 第三步:代码实现 🚩三数之和 第一步:了解题意 第二步:算法原理 思路: ❗不漏: ❗去重: &#xf…

Midjourney Prompt基本结构

在 Midjourney 的官方介绍文档里,介绍了最简单的 Prompt 结构是这样的: 但我觉得上面那个 Prompt 过于简单了 😂 ,反而 Advanced Prompt 更适合学习: Image Prompts(选填) Prompt 分成三个部分…

Spring Boot框架中Controller层API接口如何支持使用多个@RequestBody注解接受请求体参数

一、前言 众所周知,在Spring Boot框架中,Controller层API接口编码获取请求体参数时,在参数上会使用RequestBody注解;如果一次请求中,请求体参数携带的内容需要用多个参数接收时,能不能多次使用RequestBody…