组合数据类型之集合、序列

集合类型及操作

集合类型定义

首先,什么是组合数据类型,组合数据类型就是一组数据,表达一个或多个含义

集合是多个元素的无序组合

集合类型与数学中的集合概念一致

集合元素之间无序,每个元素唯一,不存在相同元素

集合元素不可更改,不能是可变数据类型 为什么?

因为,集合类型要求集合中每个元素都要是唯一的,如果我们修改了一个数据类型,改变之后导致它跟集合类型中的元素重合了,那么就会报错了

集合用大括号 {} 表示,元素间用逗号分隔

建立集合类型用 {} 或 set()

建立空集合类型,必须使用set()

使用set()方法,它会使得每一个字符单独拆分变成集合中的一个元素,如果有相同的元素,那么多出去元素就被删除,因为在集合中是没有顺序的,无序的,所有它生成整理后的元素是无序的 

集合操作符

 4个增强运算符

增强符就是修改了修改了S中的集合,不使用增加符就没有修改S中的元素,只是返回一个结果

 

集合处理方法 

 

 

将集合中的每个元素打印出来,直到集合为空退出循环

A=set("python")
try:
    while True:
        print(A.pop())
except:
    pass

数据去重:集合类型所有元素无重复

利用了集合无重复元素的特点

还可以将集合转换为列表

 序列类型及操作

序列是具有先后关系的一组元素

序列是一维元素向量,元素类型可以不同

元素间由序号引导,通过下标访问序列的特定元素

序列是一个基类类型

由序列扩展出来的字符类型,元组类型,列表类型,都十分的常用

序列处理函数及方法 

 元组类型定义

元组是序列类型的一种扩展

元组是一种序列类型,一旦创建就不能被修改

使用小括号 () 或 tuple() 创建,元素间用逗号 , 分隔

可以使用或不使用小括号

元组继承序列类型的全部通用操作

元组继承了序列类型的全部通用操作

元组因为创建后不能修改,因此没有特殊操作

使用或不使用小括号

 列表类型及操作

列表是序列类型的一种扩展,十分常用

列表是一种序列类型,创建后可以随意被修改

使用方括号 [] 或list() 创建,元素间用逗号 , 分隔

列表中各元素类型可以不同,无长度限制

就是指针指向了这个内存地址

   

# 定义空列表lt 
lt=[]
# 向lt新增5个元素
lt+=[1,2,3,4,5]
# 修改lt中第2个元素
lt[2]=6
# 向lt中第2个位置增加一个元素
lt.insert(2,7)
# 从lt中第1个位置删除一个元素
del lt[1]
# 删除lt中第1-3位置元素
del lt[1:4]
# 判断lt中是否包含数字0
0 in lt
# 向lt新增数字0
lt.append(0)
# 返回数字0所在lt中的索引
lt.index(0)
# lt的长度
#
len(lt)
# lt中最大元素
max(lt)
# 清空lt
lt.clear()

序列类型应用场景

数据表示:元组 和 列表

元组用于元素不改变的应用场景,更多用于固定搭配场景

列表更加灵活,它是最常用的序列类型

最主要作用:表示一组有序数据,进而操作它们

基本统计值计算实例

#!/usr/bin/env python
# -- coding: utf-8 --
# @Time : 2023/3/28 17:44
# @File : 基本统计值计算实例.py
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 pow(sdev / (len(numbers)-1), 0.5)

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. 定义了一个函数 getNum(),用于获取用户不定长度的输入,并将输入的数字存储在一个列表中。

  2. 定义了一个函数 mean(numbers),用于计算平均值。遍历列表中的每个数字,累加总和,最后除以数字个数得到平均值。

  3. 定义了一个函数 dev(numbers, mean),用于计算方差。遍历列表中的每个数字,计算它与平均值之间的差的平方,然后累加总和。最后除以数字个数减一,再开平方根即可得到方差。

  4. 定义了一个函数 median(numbers),用于计算中位数。先对列表进行排序,然后根据列表长度的奇偶性,取中间位置或者中间两个位置的数字,进行平均计算即可得到中位数。

  5. 主体函数中,调用 getNum() 获取用户输入的数字,然后分别调用 mean()dev() 和 median() 进行计算,并将结果格式化输出。

需要注意的是,这段代码存在一些潜在的问题,例如:

  1. 在 median() 函数中,虽然使用了 sorted() 函数进行排序,但是并没有将排序结果赋值给原列表,因此排序是无效的。

  2. 在输出结果时,使用了字符串格式化,并使用了浮点数的精度控制,但是由于浮点数的精度问题,可能会导致结果不准确。

  3. 在输入数字时,使用了 eval() 函数进行求值,可能存在安全风险,应该使用更加安全的方式进行输入。

下面是对这段代码的优化:

  1. 在 median() 函数中,将排序结果赋值给原列表,以便使用排序后的列表进行中位数计算。

  2. 在输出结果时,使用了 format() 方法进行字符串格式化,并使用了 :.2f 控制浮点数的精度,避免了浮点数精度问题。

  3. 在输入数字时,使用了 try-except 结构进行异常处理,避免了使用 eval() 函数带来的安全风险。

  4. 对代码进行了注释,增加了可读性。

下面是优化后的代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2023/3/28 17:44
# @File : 基本统计值计算实例.py

def getNum():
    """
    获取用户输入的数字,返回一个列表
    """
    nums = []
    while True:
        try:
            iNumStr = input("请输入数字(回车退出): ")
            if iNumStr == "":
                break
            nums.append(float(iNumStr))
        except:
            print("输入错误,请重新输入!")
    return nums

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

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

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

if __name__ == '__main__':
    n = getNum()
    m = mean(n)
    d = dev(n, m)
    md = median(n)
    print("平均值:{:.2f}, 方差:{:.2f}, 中位数:{:.2f}.".format(m, d, md))

 这样,代码就更加安全、可读、易用了。

猜你喜欢

转载自blog.csdn.net/weixin_64612659/article/details/129821427