ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python众数,平均数,中位数实现代码(包括字典的使用)

2021-04-09 18:03:45  阅读:204  来源: 互联网

标签:python self list 中位数 len range lists 众数 print


不使用numpy,用python实现判断一个列表中众数中位数和平均数

题目:
统计学家想要用一组函数巨酸一列数字的中位数和众数,中位数是将一个列表排序后出现在中间位置的数。众数是在列表中出现最频繁的数。在一个模块中定义这些函数。还要包含一个名为mean的函数,它计算一组数字的平均数。每个函数都接受数字的一个列表作为参数,并且返回一个单个的数字。

思路:
定义一个类,然后分别写一个排序函数,计算平均数的函数,计算中位数的函数,计算众数的函数。

排序:
用冒泡排序;

    def sorting(self, list=[]):
        for i in range(len(list)):
            for j in range(len(list) - 1 - i):
                if list[j] > list[j + 1]:
                    list[j], list[j + 1] = list[j + 1], list[j]
        return list

中位数:
当列表传入后初始化执行,排序函数,得到一个从小到大排序的列表,因此中位数是label处于中间的数值。列表的长度始终为整数,需要考虑奇偶的特性。

    def median(self,list = []):
        n = len(list)
        if (n% 2) == 0:
            local = int(n/2)
            # 除法后数据类型为float
        else:
            local = int((n+1)/2)
        return list[local]

平均数:
就列表全部加和,除以列表的长度

    def mean(self,list = []):
        sum = 0
        for i in range(len(list)):
            sum += list[i]
        means = sum/len(list)
        return means

众数:
不使用numpy的api实现找众数。
主要的思路是遍历列表中的元素,查每一个元素的出现次数,创造一个字典,字典内容分别是元素和元素对应出现的次数。
使用max函数查找value中最大的值。
但是可能列表中存在两个元素出现次数相同且都为最大的情况,这种情况下应该将几个元素都筛选出来,而直接使用max函数和对应的key-value查找只能查找出其中遍历过程中最先出现的内容。因此遍历字典找到每一个出现次数最多的元素。

    def mode(self,lists = []):
        dic = {}
        k = 1
        for i in range(len(lists)):
            for j in range(len(lists)):
                if lists[j] == lists[j-1]:
                    k += 1
                else:
                    dic[lists[j-1]] = k
                    k = 1
        value = max(dic.values())
        max_list = []
        for m, n in dic.items():  # 遍历字典一遍找对应的 key 值
            print(m,n)
            if n == value:
                max_list.append(m)
        return value,max_list

全部代码

class Calculate(object):
    def __init__(self,lists = []):
        self.sorting(lists)

    def sorting(self, list=[]):
        for i in range(len(list)):
            for j in range(len(list) - 1 - i):
                if list[j] > list[j + 1]:
                    list[j], list[j + 1] = list[j + 1], list[j]
        return list

    nums = 0
    def median(self,list = []):
        n = len(list)
        if (n% 2) == 0:
            local = int(n/2)
        else:
            local = int((n+1)/2)
        return list[local]

    def mean(self,list = []):
        sum = 0
        for i in range(len(list)):
            sum += list[i]
        means = sum/len(list)
        return means

    def mode(self,lists = []):
        dic = {}
        k = 1
        for i in range(len(lists)):
            for j in range(len(lists)):
                if lists[j] == lists[j-1]:
                    k += 1
                else:
                    dic[lists[j-1]] = k
                    k = 1
        print(dic)
        value = max(dic.values())
        max_list = []
        for m, n in dic.items():  # 遍历字典一遍找对应的 key 值
            print(m,n)
            if n == value:
                max_list.append(m)
        return value,max_list

测试代码1:

s = Calculate()
lists = [0,1,2,5,6,9,7,8,6,3,1,1,4,2,2,7,8,9,5,6,8,6,4,9,9,9,9,9,6,6,6]

new_list = s.sorting(lists)
print(new_list)
means = s.mean(lists)
print(means)
medians = s.median(lists)
print(medians)
modes = s.mode(lists)
print(modes)

结果1:

[0, 1, 1, 1, 2, 2, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9]
5.580645161290323
6
(7, [9, 6])

测试代码2:

s = Calculate()
lists = [1,5,6,8,8,8,7,7,7,9,9,9,4,4,0,0,5,5,4]

new_list = s.sorting(lists)
print(new_list)
means = s.mean(lists)
print(means)
medians = s.median(lists)
print(medians)
modes = s.mode(lists)
print(modes)

结果2:

[0, 0, 1, 4, 4, 4, 5, 5, 5, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9]
5.578947368421052
7
(3, [9, 4, 5, 7, 8])

标签:python,self,list,中位数,len,range,lists,众数,print
来源: https://blog.csdn.net/qq_35535616/article/details/115553808

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有