Python数据结构——列表

目录

一、认识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('.')
str1str1.sort()    #默认按首字母升序
str1str1.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.mzph.cn/news/619042.shtml

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

相关文章

全新加密叙事,以Solmash为代表的 LaunchPad 平台如何为用户赋能?

铭文市场的火爆带来“Fair Launch”这种全新的代币启动方式,Fair Launch 的特点在于其为所有人参与 Launch 带来了公平的机会,所有链上玩家们都需要通过先到先得的方式 Mint 资产,VC 在 Fair Launch 中几乎没有话语权,不同的投资者…

CSS伪类:为网页增添交互和样式

CSS伪类是一项强大的特性,它允许开发者根据不同的状态、位置和结构选择器来选择和样式化HTML元素。通过使用CSS伪类,我们可以为网页增添交互性、响应性和样式化效果。本文将深入探讨CSS伪类的概念、常见用法和一些实用示例。 CSS伪类是什么 CSS伪类是一…

【AI的未来 - AI Agent系列】【MetaGPT】1. AI Agent如何重构世界

上篇文章我们跑起来了第一个MetaGPT程序。本文主要学习了一下理论,什么是智能体,以及智能体如何重构世界。 0. 什么是智能体 智能体 LLM观察思考行动记忆 多智能体 智能体环境SOP评审路由订阅经济 用人话说,我理解的Agent: 智…

C#MQTT编程01--MQTT介绍

1、前言 近年来物联网的发展如火如荼已经渗透到我们生活的方方面面。从智能家居到工业自动化从智慧城市到智慧农业物联网,正在以前所未有的速度改变着我们的生活。 大家现在可能已经习惯了通过手机控制家里的灯光、空调和电视,这就是物联网在智能家居领域…

完美解决报错Please verify that the package.json has a valid “main“ entry处理方法

出现下图中的错误 ,说明缺少main入口 解决方法: 1.删除 node_modules 和 package-lock.json这两个文件 2.命令行输入npm i 会重新下载包 3.重新执行检查没有报错

01循环算法

1.求小数点的某一位&#xff0c;且超出float和double的精度问题 【题目描述】 分数a/b化为小数后&#xff0c;小数点后第n位的数字是多少&#xff1f; 【输入】 三个正整数a&#xff0c;b&#xff0c;n&#xff0c;相邻两个数之间用单个空格隔开。0<a<b<100&#…

【微信小程序独立开发2】授权登录 上

前言&#xff1a;这一节设想完成的功能为进入小程序后请求授权信息&#xff0c;用户授权登录后&#xff0c;弹出宠物登记页面&#xff0c;并根据宠物类型播放背景音乐 小程序昵称头像在之前的版本获取规则为触发后弹出用户授权弹窗&#xff0c;授权后可直接获取用户头像和昵称&…

使用 CMake 和 Ninja 构建 C/C++ 项目的教程

使用 CMake 和 Ninja 构建 C/C 项目的教程 CMake 是一个跨平台的开源构建工具&#xff0c;它简化了项目的构建过程。而 Ninja 是一个快速、轻量级的构建系统&#xff0c;与 CMake 配合使用可以提高项目的构建效率。本教程将向你介绍如何使用 CMake 和 Ninja 来构建你的 C/C 项…

金融科技革命:数字化如何塑造未来经济_光点科技

当今世界&#xff0c;数字化不仅是一种趋势&#xff0c;更是深刻重塑经济和金融领域的关键力量。在这个过程中&#xff0c;金融科技&#xff08;FinTech&#xff09;崭露头角&#xff0c;成为革命性变化的代名词。以下是数字化技术在经济和金融领域的几个关键应用&#xff0c;它…

YOLOv5独家原创改进:多层次特征融合(SDI)结合PConv、DualConv、GSConv,实现二次创新 | UNet v2最新论文

💡💡💡本文独家改进:多层次特征融合(SDI)高效结合DualConv、PConv、GSConv等实现二次创新 1)替代原始的Concat; 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合paper !!! 💡�…

高度自适应scroll-view,uniapp项目

中间粉红的区域高度自适应,不管换什么机型&#xff0c;高度都自适应 <template><!-- 合同-待确认 --><view class"viewport"><!-- 上 --><view class"top-box"><!-- tab --><view class"tabs"><te…

HTML5+CSS3+JS小实例:音频可视化

实例:音频可视化 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><m…

C++学习笔记——私有继承、多重继承、类模板

目录 一、私有继承 二、多重继承 三、类模板 四、一个使用私有继承的示例代码 4.1代码 4.2输出结果 五、多重继承案列 六、类模板案例 C中的继承和模板是非常强大和灵活的特性&#xff0c;它们可以帮助我们实现代码复用、抽象和泛化等目标。本文将着重介绍私有继承、多…

class_1:qt的安装及基本使用方式

一、选择组件&#xff1a; 1、windows编译工具&#xff1a;MinGW 7.30 32-bit MinGW 7.30 64-bit 2、QT源代码&#xff1a;sources 3、QT的绘图模块&#xff1a;QT charts 4、QT虚拟键盘&#xff1a;QT Virtual Keyboard 5、QT Creational 4.12.2 GDB 二、新建QT项目 文…

Linux完全卸载Anaconda3和MiniConda3

如何安装Anaconda3和MiniConda3请看这篇文章&#xff1a; 安装Anaconda3和MiniConda3_minianaconda3-CSDN博客文章浏览阅读474次。MiniConda3官方版是一款优秀的Python环境管理软件。MiniConda3最新版只包含conda及其依赖项如果您更愿意拥有conda以及超过720个开源软件包&…

高通平台开发系列讲解(USB篇)adb function代码分析

文章目录 一、FFS相关动态打印二、代码入口三、ffs_alloc_inst四、ep0、ep1&ep2的注册五、读写过程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文主要介绍高通平台USB adb function代码f_fs.c。 一、FFS相关动态打印 目录:msm-4.14/drivers/usb/gadget/fun…

docker+jmeter实现windows作为主控机,linux作为负载机的分布式压测环境搭建

dockerjmeter实现windows作为主控机&#xff0c;linux作为负载机的分布式压测环境搭建 1、搭建环境说明2、windows主控机安装Jmeter3、linux负载机安装Jmeter3.1、安装docker环境3.2、使用docker安装jmeter 4、windows主控机分发测试任务 1、搭建环境说明 准备一台windows主机…

时间序列数据库选型: influxdb; netdiscover列出docker实例们的ip,docker管理工具lazydocker、scope

influxdb influxdb: 有收费版本、有开源版本 influxdb 安装、启动(docker) docker run -itd --name influxdb-dev -p 8086:8086 influxdb #influxdb的web客户端(端口8003)被去掉了 #8006是web-service端口#docker exec -it influxdb-dev bashinfluxdb 自带web界面 从后面的…

Rust-函数

简介 Rust的函数使用关键字fn开头。 函数可以有一系列的输入参数&#xff0c;还有一个返回类型。 函数体包含一系列的语句(或者表达式)。 函数返回可以使用return语句&#xff0c;也可以使用表达式。 Rust编写的可执行程序的入口就是fn main()函数。 以下是一个函数的示例…

代码随想录算法训练营第四天 |24.两两交换链表中的节点,19.删除链表的倒数第N个节点,面试题02.07.链表相交,142、环形链表II

链表基础 1、链表定义&#xff1a; &#xff08;1&#xff09;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null…