Python实战基础8-列表

news2025/1/24 7:16:59

一、列表的基本使用

1.列表的格式

定义列的格式:[元素1,元素2,元素3,...,元素n]

变量tmp的类型为列表

tmp = ['XiaoChen',180,66.0]

列表中的元素可以是不同类型的

2.使用下标获取列表元素

namesList = ['XiaoChen','XiaoHuang','XiaoLiu']
print(namesList[0]) # XiaoChen
print(namesList[1]) # XiaoHuang
print(namesList[2]) # XiaoLiu

二、列表的增删改查

1.添加元素

添加元素有以下几个方法:

  • append末尾添加元素
  • insert指定位置插入元素
  • extend合并两个列表
#append会把新元素添加到列表末尾
#定义变量A,默认有三个元素
A = ['XiaoChen','XiaoHuang','XianLiu']

print('--添加之前,列表A的数据--A=%s' % A)

#提示、并添加元素
temp = input('请输入要添加的学生姓名:')
A.append(temp)
print('--添加之后,列表A的数据--=%s' % A)


#insert(index,object)在指定位置index前插入元素object
strs = ['a','b','m','s']
strs.insert(2,'c')
print(strs)#['a','b','c','m','s']


#通过extend可以将另一个集合中的元素逐一添加到列表中
a = ['a','b','c']
b = ['d','e','f']
a.extend(b)
print(a) # ['a','b','c','d','e','f']将b添加到a里
print(b) # ['d','e','f'] b的内容不变

2.修改元素

通过指定下标来访问列表元素,因此修改元素的时候,为指定的列表下标赋值即可。

#定义变量A,默认有三个元素
A = ['XiaoChen','XiaoHuang','XianLiu']

print('--添加之前,列表A的数据--A=%s' % A)

#修改元素
A[1] = 'XiaoZhang'
print('--添加之后,列表A的数据--=%s' % A) # ['XiaoChen', 'XiaoZhang', 'XianLiu']

3.查找元素 

查看指定的元素是否存在,以及查看元素所在的位置,主要有以下几个方法:

  • in 和 not in
  • index 和 count
#in(存在),如果存在那么结果为true,否则为false
#not in(不存在),如果不存在那么结果为true,否则false
# 待查找的列表
nameList = ['XiaoChen','XiaoHuang','XianLiu']

#获取要查找的名字
findName = input('请输入要查找的名字:')

#查找是否存在
if findName in nameList:
    print('找到了相同名字')
else:
    print('没有找到')

说明:in的方法只要会用了,那么not in也是同样的用法,只不过not in判断的是不存在 

index用来查找元素所在的位置,如果未找到则会报错;

count用来计算某个元素出现的次数。它们的使用和字符串里的使用效果一致。

a = ['a','b','c','d','a','b']
# print(a.index('a',1,3)) # 注意是左闭右开区间
# 报错 ValueError: 'a' is not in list
print(a.index('a',1,5)) # 4
print(a.count('b')) # 2
print(a.count('f')) # 0

4.删除元素 

列表元素的常用删除方法有:

  • del:根据下标进行删除
  • pop:删除最后一个元素
  • remove:根据元素的值进行删除
#del
movieName = ['加勒比海盗','泰坦尼克号','冰雪奇缘','变形金刚','杀死比尔']
print('删除之前:' ,movieName)
del movieName[2]
print('删除之后:',movieName)
#运行结果
# 删除之前: ['加勒比海盗', '泰坦尼克号', '冰雪奇缘', '变形金刚', '杀死比尔']
# 删除之后: ['加勒比海盗', '泰坦尼克号', '变形金刚', '杀死比尔']


#pop
movieName = ['加勒比海盗','泰坦尼克号','冰雪奇缘','变形金刚','杀死比尔']
print('删除之前:' ,movieName)
movieName.pop()
print('删除之后:',movieName)
#运行结果
# 删除之前: ['加勒比海盗', '泰坦尼克号', '冰雪奇缘', '变形金刚', '杀死比尔']
# 删除之后: ['加勒比海盗', '泰坦尼克号', '冰雪奇缘', '变形金刚']

#remove
movieName = ['加勒比海盗','泰坦尼克号','冰雪奇缘','变形金刚','杀死比尔']
print('删除之前:' ,movieName)
movieName.remove('加勒比海盗')
print('删除之后:',movieName)
#运行结果
# 删除之前: ['加勒比海盗', '泰坦尼克号', '冰雪奇缘', '变形金刚', '杀死比尔']
# 删除之后: ['泰坦尼克号', '冰雪奇缘', '变形金刚', '杀死比尔']

5.排序(sort,reverse) 

sort方法是将list按特定顺序重新排列,默认为由小到大,参数reverse=True可改为倒序,由大到小。

reverse方法是将list逆置

a = [1, 4, 2, 3]
a.reverse() # 逆置,不排序
print(a) # [3, 2, 4, 1]

a.sort() # 默认从小到大排序
print(a) # [1, 2, 3, 4]

a.sort(reverse=True) # 从大到小排序
print(a) #[4, 3, 2, 1]

 练习:请删除列表words = ['hello','','','good','hi','','yes','','no']里所有的空字符串。

利用while循环遍历列表,设置从0开始遍历,
# 如果存在空字符串,则删除空字符串,同时令i-1,实现全部遍历
words = ['hello','','','good','hi','','yes','','no']
i = 0
while i < len(words):
    if words[i] == '':
        words.remove(words[i])
        i -= 1
    i += 1
print(words)

三、列表的遍历

1.使用while循环

nameList = ['xiaoWang','xiaoChen','xiaoHuang']
length = len(nameList) # 获取列表长度
i = 0
while i < length:
    print(nameList[i])
    i += 1
#输出结果
# xiaoWang
# xiaoChen
# xiaoHuang

2.使用for循环 

nameList = ['xiaoWang','xiaoChen','xiaoHuang']
for name in nameList:
    print(name)
#输出结果
#xiaoWang
#xiaoChen
#xiaoHuang

3.交换2个变量的值

#使用中间变量
a = 4
b = 5
c = 0

c = a
a = b
b = c

print(a)  # 5
print(b) # 4

4.练习 

手动实现冒泡排序(难)

nums = [5,1,7,6,8,2,9,3]

for j in range(0,len(nums) -1):
    for i in range(0,len(nums) - 1 -j):
        if nums[i] > nums[i + 1]:
            a = nums[i]
            nums[i] = nums[i+1]
            nums[i+1] = a
print(nums)

 有一个列表names,保存了一组姓名names=['zhangsan','lisi','chris','jerry','henry'],再让用户输入一个姓名,如果这个姓名在列表里存在,提示用户姓名已存在;如果这个姓名在列表里不存在,就将这个姓名添加到列表里。

#方法一
names = ['zhangsan','lisi','chris','jerry','henry']
username = input('请输入一个姓名:')
if username in names:
    print('用户名已经存在')
else:
    names.append(username)
print(names)

#方法二
for name in names:
    if username == name:
        print('用户名已经存在')
        break
else:
    names.append(username)
print(names)

四、列表的嵌套

1.列表嵌套

类似while循环的嵌套,列表也是支持嵌套的

一个列表中的元素又是一个列表,那么这就是列表的嵌套

此处重点掌握怎么操作被嵌套的列表

schoolNames = [
    [1,2,3],
    [11,22,33],
    [111,222,333]
]
print(schoolNames[1][2]) # 33
a = schoolNames[1][2] = 'abc' # 把33修改为'abc'
print(schoolNames) # [[1, 2, 3], [11, 22, 'abc'], [111, 222, 333]]
print(schoolNames[1][2][2])#获取'abc'里的字符c

操作嵌套列表,只要把要操作元素的下标当作变量名来使用即可。 

 2.应用

一个学校,有3个办公室,现在有8位老师等待工位的分配,请编写程序,完成随机的分配

import random

#定义一个列表用来保存3个办公室
offices = [[],[],[]]

#定义一个列表用来存储8位老师的名字
names = ['A','B','C','D','E','F','G','H']

i = 0
for name in names:
    index = random.randint(0,2)
    offices[index].append(name)

i = 1
for tempNames in offices:
    print('办公室%d的人数为:%d'%(i,len(tempNames)))
    i += 1
    for name in tempNames:
        print('%s'%name,end='')
    print("\n")
    print("-"*20)

运行结果:

 

五、列表的推导式

所谓列表推导式,就是指的轻量级循环创建列表

1.基本的方式

a = [x for x in range(4)]
print(a) # [0, 1, 2, 3]

b = [x for x in range(3,4)]
print(b) # [3]

c = [x for x in range(3,10)]
print(c) # [3, 4, 5, 6, 7, 8, 9]

d = [x for x in range(3,19,2)]
print(d) # [3, 5, 7, 9, 11, 13, 15, 17]

2.在循环的过程中使用if

a = [x for x in range(3,10) if x%2==0]
print(a) # [4, 6, 8]

b = [x for x in range(3,10) if x%2!=0]
print(b) # [3, 5, 7, 9]

c = [x for x in range(3,10)]
print(c) # [3, 4, 5, 6, 7, 8, 9]

3.2个for循环 

a = [(x,y) for x in range(1,3) for y in range(3)]
print(a) # [(1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

4.3个for循环

a = [(x,y,x) for x in range(1,3) for y in range(3) for z in range(4,6)]
print(a)
#输出结果
#[(1, 0, 1), (1, 0, 1), (1, 1, 1), (1, 1, 1), (1, 2, 1), 
# (1, 2, 1), (2, 0, 2), (2, 0, 2), (2, 1, 2), (2, 1, 2), (2, 2, 2), (2, 2, 2)]

4.4练习 

请写出一段python代码实现分组一个list里面的元素,比如[1,2,3,... 100]变成[[1,2,3],[4,5,6]...]

a = [x for x in range(1,101)]
b = [a[x:x+3] for x in range(0,len(a),3)]
print(a)
print(b)

六、列表的复制

a = 12
b = a
b = 13
print(b) # 13
print(a) # 12

nums1 = [1,5,8,9,10,12]
nums2 = nums1
print(nums2) # [100, 5, 8, 9, 10, 12]
print(nums1) # [100, 5, 8, 9, 10, 12]

1.为什么修改了nums2里的数据,nums1的数据也会改变?

Python中的赋值运算都是引用(即内存地址)的传递。对于可变类型来说,修改原数据的值,会改变赋值对象的值。

2.怎样nums1和nums2变成两个相互独立不受影响的列表?

使用列表的copy方法,或者copy模块就可以赋值一个列表。

1.列表的copy方法

使用列表的copy方法,可以直接将原来的列表进行复制,变成一个新的列表,这种复制方式是浅复制。

nums1 = [1,5,8,9,10,12]
nums2 = nums1.copy() # 调用列表的copy方法,可以复制出一个新的列表

nums2[0] = 100

# 修改新列表里的数据,不会影响到原有列表里的数据
print(nums2) # [100, 5, 8, 9, 10, 12]
print(nums1) # [1, 5, 8, 9, 10, 12]

2.copy模块的使用

除了使用列表的copy方法以外,python还提供了copy模块来复制一个对象。copy模块提供了浅复制和深复制两种方式,它们的使用方式相同,但是执行的效果有一定的差异。

2.1 浅拷贝

浅拷贝是对于一个对象的顶层拷贝,通俗的理解是:拷贝了引用,并没有拷贝内容。

import copy

words1 = ['hello','good',['yes','ok'],'bad']

#浅拷贝只会拷贝最外层的对象,里面的数据不会拷贝,而是直接指向
words2 = copy.copy(words1)

words2[0] = '你好'
words2[2][0] = 'no'

print(words1) # ['hello','good',['no','ok'],'bad]
#words2里的yes被修改成了no
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']

2.2 深拷贝

深拷贝是对于一个对象所有层次的递归拷贝。

import copy

words1 = ['hello','good',['yes','ok'],'bad']

#深拷贝会将对象里的所有数据都进行拷贝
words2 = copy.deepcopy(words1)

words2[0] = '你好'
words2[2][0] = 'no'

print(words1) # ['hello', 'good', ['yes', 'ok'], 'bad']
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']

2.3 切片

列表和字符串一样,也支持切片,切片其实就是一种浅拷贝。

words1 = ['hello','good',['yes','ok'],'bad']
words2 = words1[:]
words2[0] = '你好'
words2[2][0] = 'no'
print(words1) # ['hello', 'good', ['no', 'ok'], 'bad']
print(words2) # ['你好', 'good', ['no', 'ok'], 'bad']

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

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

相关文章

上海AI lab提出VideoChat:可以与视频对话啦

夕小瑶科技说 原创 作者 | 小戏、ZenMoore 视频相比语言、图像&#xff0c;是更复杂更高级的一类表征世界的模态&#xff0c;而视频理解也同样是相比自然语言处理与计算机视觉的常见工作更复杂的一类工作。在当下大模型的洪流中&#xff0c;自然而然的想法就是大规模语言模型…

子矩形计数(多少个面积为k的全1子矩阵)【思维,两个一维数组相乘得到矩阵,计算一维数组中长度为x的全1子段】

3617. 子矩形计数&#xff08;多少个面积为k的全1子矩阵&#xff09; 输入样例1&#xff1a; 3 3 2 1 0 1 1 1 1输出样例1&#xff1a; 4输入样例2&#xff1a; 3 5 4 1 1 1 1 1 1 1 1输出样例2&#xff1a; 14#include <bits/stdc.h> using namespace std; #define …

Redisson锁的分析

文章目录 一、分布式锁概念1、实现思路2、出现死锁问题如何避免死锁问题 锁过期和释放当前不属于当前线程的锁解决不是加锁线程释放锁锁的过期时间如何解决 二、Redisson分布式锁Redis的部署方式对锁的影响集群模式Redlock实现高可靠的分布式锁 三、代码分析V1代码无锁V2代码单…

【C++从0到王者】第二站:类和对象(中)赋值运算符重载

文章目录 一、运算符重载1.运算符重载的使用2.运算符重载的注意事项 二、赋值运算符重载1.复制拷贝与拷贝构造2.赋值运算符重载的格式3.赋值运算符重载的实现4.赋值运算符重载的注意事项 一、运算符重载 1.运算符重载的使用 当我们实现一个日期类的时候&#xff0c;我们有时候…

Angular开发之——Angular打包部署项目(04)

一 概述 ng build 构建应用lite-server介绍及安装lite-server部署应用IIS管理器部署应用 二 ng build 构建应用 2.1 执行如下指令构建应用 ng build2.2 构建完成后&#xff0c;会创建一个 dist 文件夹 2.3 直接打开index.html会出错(需要借助于服务器部署) 三 lite-server介…

(二)PUN 2基本教程

一、介绍 PUN 基础教程是一个基于 Unity 的教程。我们将使用 Photon Cloud 开发第一个简单的 PUN 2 多人游戏。目标是同步每个玩家的动画角色、健康值和基本光线投射。 1.概述 本教程将从一个空项目开始&#xff0c;逐步指导您完成整个创建过程。在此过程中&#xff0c;将解释…

Halcon 形态学 开发案例 (开运算opening(先腐蚀再膨胀)、闭运算closing(先膨胀再腐蚀))

文章目录 1 形态学概念2 开运算 opening2.1 算子介绍2.2 开运算 开发案例3 闭运算 closing3.1 算子介绍3.2 闭运算 开发案例4 示例原图1 形态学概念 图像的形态学处理是对图像的局部像素进行处理,用于从图像中提取有意义的局部图像细节。 通过改变局部区域的像素形态,以对目…

数据结构与算法基础知识

线性结构篇 什么是数据结构与算法 回顾我们之前的C语言程序设计阶段&#xff0c;我们已经接触过基本数据类型&#xff0c;并且能够使用结构体对数据进行组织&#xff0c;我们可以很轻松地使用一个结构体来存放一个学生的完整数据&#xff0c;在数据结构学习阶段&#xff0c;我…

Linux篇1

Linux 1. 概述1.1 内容概要1.2 Linux发展1.3 Linux对比Windows 2. 虚拟机下安装CentOS系统2.1 下载安装VMware2.1.1 官网下载VMware软件2.1.2 安装VMware 2.2 下载CentOS镜像2.3 创建虚拟机&#xff08;在虚拟机中安装CentOS&#xff09;2.3.1 创建虚拟硬件环境2.3.2 安装CentO…

从匆匆的一瞥,到两小时泯灭(SQL注入)

从匆匆的一瞥&#xff0c;到两小时泯灭&#xff08;SQL注入&#xff09; 惊鸿一瞥用户名提示jsBase64.js文件手搓轮子&#xff08;python&#xff09;反复搓轮子&#xff08;python-tamper&#xff09; 惊鸿一瞥 昨天晚上分别开了我相识已久的女友&#xff0c;再度回到了单身狗…

暗月内网靶场渗透笔记

简介 靶场下载地址&#xff1a; 靶场地址&#xff1a; https://pan.baidu.com/s/12pSYxSU-ZmurQ9–GFiaXQ 提取码: 3p47虚拟机网络设置&#xff1a; 靶场拓扑图&#xff1a; 靶机账号密码&#xff1a; 信息收集 内网扫描 靶机就在本地&#xff0c;直接进行本地内网扫描即可…

朋友去华为面试,轻松拿到30K的Offer,羡慕了......

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

OpenGL高级-几何着色器

几何着色器的介绍 在顶点和片段着色器之间有一个可选的着色器&#xff0c;叫做几何着色器(Geometry Shader)。几何着色器以一个或多个表示为一个单独基本图形&#xff08;primitive&#xff09;的顶点作为输入&#xff0c;比如可以是一个点或者三角形。几何着色器在将这些顶点发…

C++14中lambda表达式新增加的features的使用

lambda表达式是在C11中引入的&#xff0c;它们可以嵌套在其它函数甚至函数调用语句中&#xff0c;C11中lambda表达式的使用参考&#xff1a;https://blog.csdn.net/fengbingchun/article/details/52653313 lambda表达式语法如下&#xff1a;除capture和body是必须的&#xff0c…

索引的作用与结构(数据库)

目录 一、索引概述 1、什么叫索引 2、索引的作用 二、SQL Server索引下的数据组织结构 1&#xff0e;堆集结构 2&#xff0e;聚集索引结构 3&#xff0e;非聚集索引 4&#xff0e;扩展盘区空间的管理 一、索引概述 1、什么叫索引 数据库中的索引与书籍中的索引类似&…

【数据分享】2014-2023年全国各监测站点的逐时、逐日、逐月、逐年AQI数据

空气质量的好坏反映了空气的污染程度&#xff0c;在各项涉及城市环境的研究中&#xff0c;空气质量都是一个十分重要的指标。空气质量是依据空气中污染物浓度的高低来判断的。 我们发现学者王晓磊在自己的主页里面分享了2014年5月以来的全国范围的到站点&#xff08;全国有约2…

小实验:关于期望的乘法性质

小实验&#xff1a;关于期望的乘法性质 引言个人疑惑验证过程样本生成实验过程 附&#xff1a;完整代码 引言 本节通过代码实现期望的乘法性质。 个人疑惑 在数学期望的定义中&#xff0c;有一条随机变量期望的乘法性质&#xff1a; 当随机变量 X , Y \mathcal X,\mathcal Y…

spring如何处理循环依赖

何为循环依赖 所谓的循环依赖&#xff0c;就是两个或者两个以上的bean互相依赖对方&#xff0c;最终形成闭环。比如“A对象依赖B对象&#xff0c;而B对象也依赖A对象”&#xff0c;或者“A对象依赖B对象&#xff0c;B对象依赖C对象&#xff0c;C对象依赖A对象”&#xff1b;类…

MySQL笔记-多表查询

本文标签 : 多表查询 事务四大特性 并发事务问题 事务隔离级别 文章目录 目录 文章目录 一、多表查询 1.多表关系 2.多表查询概念 3.多表查询的分类 4.内连接 5.外连接 6.自连接 7.联合查询 8.子查询 1.标量子查询 2.列子查询 3.行子查询 4.表子查询 9.多表查询案例练习 二…

springboot+vue汉服文化平台网站(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的汉服文化平台网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…