[Python] 列表类型和操作

🔥 信仰:一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去
🎶 博客主页:程序喵正在路上 的博客主页
🦋 欢迎关注🖱点赞👍收藏🌟留言🐾
🦄 本文由 程序喵正在路上 原创,CSDN首发!
💖 系列专栏:Python学习
🌠 首发时间:2022年5月6日
✅ 如果觉得博主的文章还不错的话,希望小伙伴们三连支持一下哦

1. 列表类型的概述

1.1 列表类型的概念

列表 (list) 是包含 0 个或多个对象引用的有序序列,属于序列类型。与元组不同,列表的长度和内容都是可变的,可自由对列表中的数据项进行增加、删除或替换。列表没有长度限制,元素类型可以不同,使用非常灵活。

由于列表属于序列类型,所以列表也支持成员关系操作符 (in)、 长度计算函数 (len())、分片 ([])。 列表可以同时使用正向递增序号和反向递减序号,可以采用标准的比较操作符 (<<===!=>=>) 进行比较,列表的比较实际上是单个数据项的逐个比较。

列表用中括号([]) 表示,也可以通过 list() 函数将元组或字符串转化成列表。直接使用 list() 函数会返回一个空列表,例如:

ls = list()
print(ls)

[]

ls = [425,"BIT",[10,"ABC"],425]
print(ls)

[425, ‘BIT’, [10, ‘ABC’], 425]

ls = [425,"BIT",[10,"ABC"],425]
print(ls[2][-1][0])

A

ls = list((425,"BIT",[10,"ABC"],425))
print(ls)

[425, ‘BIT’, [10, ‘ABC’], 425]

ls = list("中国是一个伟大的国家")
print(ls)

[‘中’, ‘国’, ‘是’, ‘一’, ‘个’, ‘伟’, ‘大’, ‘的’, ‘国’, ‘家’]

1.2 列表和数组的异同

每种编程语言都提供一个或多个表示一组元素的方法,例如,C语言采用数组,Python 采用列表,在大多数语言中,数组十分常见,仅有少量语言采用列表而不是数组。列表和数组类似,但并不完全一样,列表和数组有两个显著不同。

第一,数组需要预先分配大小,列表则不需要。当创建一个数组时,必须指定数组的大小,即它能容纳元素的个数。如果不知道有多少元素,必须假设一个最大可能的数值,再按照这个最大值分配一个数组,并记录数组中实际存储元素的个数,以保证实际使用的元素数量不超过数组的限制。列表则没有预分配大小的要求和限制,创建列表变量时不需要知道元素个数,可以在使用中动态插入任何数量的元素。

第二,数组要求元素类型一致,列表则不需要。数组要求每个元素具有相同的数据类型,如果某个元素是整数,则数组中全部元素都是整数。列表没有上述限制,列表中不同元素的类型可以相同,也可以不同,甚至,列表中的元素也可以是列表类型。列表的这个特点十分灵活,为程序编写提供了很大的设计空间。

与整数和字符本不同,列表要处理组数据, 因此,列表必须通过显式的数据赋值才能生成,简单将一个列表赋值给另一个列表不会生成新的列表对象,例如:

ls = [425,"BIT",1024]       # 用数据赋值产生列表 ls
lt = ls                     # lt 是 ls 所对应数据的引用,lt 并不包含真实数据
ls[0] = 0
print(lt)

程序执行结果如下:

[0, ‘BIT’, 1024]

如上例所示,ls 由实际数据赋值产生,为列表对象。将 ls 赋值给列表 It 仅能产生对列表 ls 的一个新的引用,此时,ItIs 变量都是实际数据 [425,“BIT”, 1024] 的表示或引用,真实数据只存储一份,因此,修改 ls 也同时修改了 lt,这个关系如下图所示:

2. 列表类型的操作

列表是序列类型,因此,12 个序列类型的操作符和函数都可应用于列表类型。还不了解的小伙伴可以看一下这篇博客:组合数据类型概述

由于列表是可变的,下面我们给出了列表类型额外的 14 个常用函数或方法。

函数或方法描述
Is[i] = x替换列表 Isi 数据项为 x
ls[i:j]= It用列表 It 替换列表 Is 中第 i 到第 j 项数据(不含第 j 项,下同)
ls[i:j:k]= lt用列表 It 替换列表 ls 中第 i 到第 j 项以 k 为步数的数据
del ls[i: j]删除列表 Isi 到第 j 项数据,等价于 Is[i:j]=[]
del ls[i:j: k]删除列表 lsi 到第 j 项以 k 为步数的数据
ls+=lt 或 ls.extend(lt)将列表 It 元素增加到列表 Is
ls *= n更新列表 Is,其元素重复 n
ls.append(x)在列表 Is 最后增加一个元素 x
ls.clear()删除 ls 中的所有元素
ls.copy()生成一个新列表,复制 Is 中的所有元素
ls.insert(i, x)在列表 ls 的第 i 位置增加元素 x
ls.pop(i)将列表 ls 中的第 i 项元素取出并删除该元素
ls.remove(x)将列表中出现的第一个元素 x 删除
ls.reverse( )列表 Is 中的元素反转

上述操作符主要处理列表的增删改等功能,例如:

vlist = list(range(5))
print(vlist)

print(len(vlist[2:]))			# 计算从第 3 个位置开始到结尾的子串个数

print(2 in vlist)				# 判断 2 是否在列表 vlist 中

vlist[3] = "python"				# 修改序号 3 的元素值和类型
print(vlist) 

vlist[1:3] = ["bit","computer"]	
print(vlist)

上述程序执行结果如下:

vlist = list(range(5))
print(vlist)

[0, 1, 2, 3, 4]

print(len(vlist[2:]))			# 计算从第 3 个位置开始到结尾的子串个数

3

print(2 in vlist)				# 判断 2 是否在列表 vlist 中

True

vlist[3] = "python"				# 修改序号 3 的元素值和类型
print(vlist)

[0, 1, 2, ‘python’, 4]

vlist[1:3] = ["bit","computer"]	
print(vlist)

[0, ‘bit’, ‘computer’, ‘python’, 4]

上述例子中,vlist[3] 从整数变成了字符串,子序列 vlist[1:3] 被另一个列表赋值修改。需要注意的是,当使用一个列表改变另一个列表值时,Python 不要求两个列表长度一样,但遵循 “多增少减” 的原则,例如:

vlist = [0, "bit", "computer", "python", 4]
vlist[1:3] = ["new_bit", "new_computer", 123]
print(vlist)

[0, ‘new_bit’, ‘new_computer’, 123, ‘python’, 4]

vlist = [0, "new_bit", "new_computer", 123, "python", 4]
vlist[1:3] = ["fewer"]
print(vlist)

[0, ‘fewer’, 123, ‘python’, 4]

vlist[1:3] 子序列包含两个元素,对其赋值时却给了 3 个元素,Python 接受这种方式,并不会报错,vlist 结果包含了赋值列表中的多余元素。同样,当使用包含更少元素赋值列表时,原列表元素会相应减少。可以通过赋给更多或更少元素实现对列表元素的插入或删除。

与元组一样,列表可以通过 for-in 语句对其元素进行遍历,基本语法结构如下:

for <任意变量名> in <列表名>:
   <语句块>

例如:

vlist = [0, "new_bit", "new_computer", 123, "python", 4]
for e in vlist:
    print(e, end="  ")

程序执行结果如下:

0 new_bit new_computer 123 python 4

列表是一个十分灵活的数据结构,它具有处理任意长度、混合类型数据的能力,并提供了丰富的基础操作符和方法。当程序需要使用组合数据类型管理批量数据时,请尽量使用列表类型。

3. 列表的应用:基本统计值计算

概要:这是一个计算多数据基本统计值的例子。

统计是计算科学、管理学、社会学、数学等诸多领域的基本问题,相关问题、方法和技术组成了一门学科,即 “统计学”。Python 的列表数据结构能够支持基本的数据统计应用。本节以最简单的统计问题为例,求解一组不定长数据的基本统计值,即平均值、标准差、中位数。

一组数据表示为 S=s0,s1, … ,sn-1,其算术平均值、标准差计算公式分别表示如下:

中位数指 S 中所有数按照从小到大(或者从大到小)顺序排列后,处于最中间位置的数据值。如果 n 是奇数,则序列 S 的最中间位置是一个数据,可以表示为 sn//2(n=0,1,2,…);如果 n 是偶数,序列 S 不存在一个最中间位置,则中位数表示为最中间两个位置数据的平均值,即 (sn/2-1+sn/2)/2。 例如,(5,2,1,3,4) 的中位数是 3,而 (4,2,1,3) 的中位数是 (2+3)/22.5。这个问题的 IPO 描述如下:

输入:从用户输入、文件、网络等途径获取一组数据
处理:适当的数据结构和算法
输出:平均值、标准差和中位数

由于平均值、标准差和中位数是 3 个不同的计算目标,使用函数方式编写计算程序。定义 getNum() 函数从用户输入获得数据,mean() 函数计算平均值,dev() 函数计算标准差,median() 函数计算中位数。由于该问题不限制用户输入数据的最大个数,所以,使用列表作为承载和存储数据的数据类型。

完整代码如下:

from math import sqrt

def getNum():   		# 获取用户不定长输入
    nums = []
    iNumStr = input("请输入数字(直接输入回车退出): ")
    while iNumStr != "":
        nums.append(eval(iNumStr))
        iNumStr = input("请输入数字(直接输入回车退出): ")
    return nums

def mean(numbers):  	# 计算平均值
    s = 0.0
    for num in numbers:
        s = s + num
    return s / len(numbers)

def dev(numbers, mean):  # 计算方差
    sdev = 0.0
    for num in numbers:
        sdev = sdev + (num - mean) ** 2
    return sqrt(sdev / (len(numbers) - 1))

def median(numbers):  	# 计算中位数
    sorted(numbers)
    size = len(numbers)
    if size % 2 == 0:
        med = (numbers[size // 2 - 1] + numbers[size // 2]) / 2
    else:
        med = numbers[size // 2]
    return med

n = getNum()            # 主体函数
m = mean(n)
print("平均值: {},方差: {:.2},中位数: {}.".format(m, dev(n, m), median(n)))

程序执行结果如下:

请输入数字(直接输入回车退出): 1
请输入数字(直接输入回车退出): 2
请输入数字(直接输入回车退出): 3
请输入数字(直接输入回车退出): 4
请输入数字(直接输入回车退出): 5
请输入数字(直接输入回车退出):
平均值: 3.0,方差: 1.6,中位数: 3.

程序的主函数部分,先后调用 getNum()mean()dev()median() 函数。利用函数的模块化设计能够复用代码并增加代码的可读性。每个函数内部都采用了简单的语句。

getNum() 函数循环从控制台获得用户输入的数字,当用户按 Enter 键时退出,所有数据保存在 nums 列表中。列表 nums 初始化时定义为空,而后根据输入逐渐增加其长度。

mean() 函数用浮点数 s 记录列表 numbers 求和的结果。其中,for 语句表示从列表 numbers 中取出每一个元素, 将其加到 s 变量中,直到 numbers 中的最后一个元素。最后,通过 return 语句返回平均值,len(numbers) 用于计算列表的长度。

为了计算标准差,需要知道数据的平均值,由于 mean() 函数已经可以计算平均值,将均值作为一个参数输入标准差 dev() 函数。dev() 函数中 **(val)2 用于计算 val 的平方,sqrt(val) 计算 val 的平方根。

根据中位数的定义,中位数函数 median() 首先使用 Python 内置函数 sorted() 对列表 numbers 进行排序,然后根据中位数定义计算中位数。

列表在实现基本数据统计时发挥了很重要的作用,主要表现在以下 3 个方面:

(1) 列表是一个动态长度的数据结构,可以根据需求增加或减少元素。

(2) 列表的一系列方法或操作符为计算提供了简单的元素运算手段。

(3) 列表提供了对每个元素的简单访问方式及所有元素的遍历方式。

中位数有什么含义呢

中位数是统计学中常用的一个指标,它可以将数值集合划分为相等的两部分。中位数不受数列分布的极大或极小值影响,从而在一定程度上代表了分布数列,它也是一种衡量集中趋势的方法。

根据国家统计局发布的 2016 年上半年主要经济指标,上半年全国居民人均可支配收入 11886 元,全国居民人均可支配收入中位数 10505 元,说明全国多于一半的居民收入低于平均值。

🧸这次的分享就到这里啦,继续加油哦^^
🍭有出错的地方欢迎在评论区指出来,共同进步,谢谢啦

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序喵正在路上

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值