信仰:一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去
博客主页:程序喵正在路上 的博客主页
欢迎关注点赞收藏留言
本文由 程序喵正在路上 原创,CSDN首发!
系列专栏:Python学习
首发时间:2022年5月6日
✅ 如果觉得博主的文章还不错的话,希望小伙伴们三连支持一下哦
列表 (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)
[‘中’, ‘国’, ‘是’, ‘一’, ‘个’, ‘伟’, ‘大’, ‘的’, ‘国’, ‘家’]
每种编程语言都提供一个或多个表示一组元素的方法,例如,C语言采用数组,Python 采用列表,在大多数语言中,数组十分常见,仅有少量语言采用列表而不是数组。列表和数组类似,但并不完全一样,列表和数组有两个显著不同。
第一,数组需要预先分配大小,列表则不需要。当创建一个数组时,必须指定数组的大小,即它能容纳元素的个数。如果不知道有多少元素,必须假设一个最大可能的数值,再按照这个最大值分配一个数组,并记录数组中实际存储元素的个数,以保证实际使用的元素数量不超过数组的限制。列表则没有预分配大小的要求和限制,创建列表变量时不需要知道元素个数,可以在使用中动态插入任何数量的元素。
第二,数组要求元素类型一致,列表则不需要。数组要求每个元素具有相同的数据类型,如果某个元素是整数,则数组中全部元素都是整数。列表没有上述限制,列表中不同元素的类型可以相同,也可以不同,甚至,列表中的元素也可以是列表类型。列表的这个特点十分灵活,为程序编写提供了很大的设计空间。
与整数和字符本不同,列表要处理组数据, 因此,列表必须通过显式的数据赋值才能生成,简单将一个列表赋值给另一个列表不会生成新的列表对象,例如:
ls = [425,"BIT",1024] # 用数据赋值产生列表 ls
lt = ls # lt 是 ls 所对应数据的引用,lt 并不包含真实数据
ls[0] = 0
print(lt)
程序执行结果如下:
[0, ‘BIT’, 1024]
如上例所示,ls 由实际数据赋值产生,为列表对象。将 ls 赋值给列表 It 仅能产生对列表 ls 的一个新的引用,此时,It 和 Is 变量都是实际数据 [425,“BIT”, 1024] 的表示或引用,真实数据只存储一份,因此,修改 ls 也同时修改了 lt,这个关系如下图所示:
列表是序列类型,因此,12 个序列类型的操作符和函数都可应用于列表类型。还不了解的小伙伴可以看一下这篇博客:组合数据类型概述
由于列表是可变的,下面我们给出了列表类型额外的 14 个常用函数或方法。
函数或方法 | 描述 |
---|---|
Is[i] = x | 替换列表 Is 第 i 数据项为 x |
ls[i:j]= It | 用列表 It 替换列表 Is 中第 i 到第 j 项数据(不含第 j 项,下同) |
ls[i:j:k]= lt | 用列表 It 替换列表 ls 中第 i 到第 j 项以 k 为步数的数据 |
del ls[i: j] | 删除列表 Is 第 i 到第 j 项数据,等价于 Is[i:j]=[] |
del ls[i:j: k] | 删除列表 ls 第 i 到第 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
列表是一个十分灵活的数据结构,它具有处理任意长度、混合类型数据的能力,并提供了丰富的基础操作符和方法。当程序需要使用组合数据类型管理批量数据时,请尽量使用列表类型。
概要:这是一个计算多数据基本统计值的例子。
统计是计算科学、管理学、社会学、数学等诸多领域的基本问题,相关问题、方法和技术组成了一门学科,即 “统计学”。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)/2 为 2.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 元,说明全国多于一半的居民收入低于平均值。
这次的分享就到这里啦,继续加油哦^^
有出错的地方欢迎在评论区指出来,共同进步,谢谢啦