提高元组的访问效率 and 统计一个序列中元素出现的频度

二、提高元组的访问效率

1.1 问题引入

我们一般访问python中数据结构的时候都是通过其数组下标进行访问的,元组,列表,集合等等都是的,但是如果数据比较杂乱,我们要改怎样处理呢?

a = ('gorit','male','18','[email protected]')

#访问姓名
print(a[0])
#访问邮箱
print(a[3])

但是数据多起来后,加上qq号,手机号,地址,邮编等等一些更多的信息,这么多哪里记得住啊

1.2 解决方案

1、定义数值常量

学过c语言的同学知道,这种问题可以用结构体,宏定义,还有枚举类型解决。python中虽然没宏定义,但我们可以用类似宏定义的方式,但不是宏定义可以解决,看下面这段代码

#Name = 0
#Gender = 1
#Age = 2
#Emil = 3

#上面的太慢了,我们可以使用列表拆包的形式,快速赋值
Name,Gender,Age,Emil = range(4)
a = ('gorit','male','18','[email protected]')

#访问姓名
print(a[Name])
#访问邮箱
print(a[Emil])
2、运用标准库中collections.namedtuple替代内置tuple

实际上就是通过类和创建对象进行访问

from collections import namedtuple

student = namedtuple('Student',['name','gender','age','emil'])

stu1 = student('gorit','male','18','[email protected]')
print(stu1.name)
print(stu1.age)
print(stu1.gender)
print(stu1.emil)

在这里插入图片描述

三、统计序列中元素出现的频度

2.1 场景再现

1、给定一个某随机序列[11,22,33,2,3,2,2,4,5,1,…],找到出现次数最高的三个元素,它们出现的次数是多少?
2、统计四六级考试中阅读题中出现频率最高的10歌词,它们出现的次数是多少

2.2 常用方法

我们先创建一个随机数列

from random import randint

data = [randint(0,20) for _ in range(1,21)]

我们的目的是统计数据,所以就需要用字典来存储,键代表数字,值代表出现的次数,最后用循环迭代,就可以统计出我们需要的数据,看下面这段代码

from random import randint

data = [randint(0,10) for _ in range(1,11)]#随机数生成随机列表
print(data)
c = dict.fromkeys(data,0)#键值配对

for x in data:
    c[x] +=1#出现一次 加一

print(c)

在这里插入图片描述
现在回到一开始的问题,统计出现次数最高的前三个数,我们进行一次排序即可

2.3 其它方案

2.3.1 使用collections.Counter对象

代码实现:

from random import randint
from collections import Counter
data = [randint(0,10) for _ in range(1,11)]

c1 = Counter(data)
print(data)
print(c1)

在这里插入图片描述
我们使用Counter构造器可以很容易的看出统计的结果,但这并不是最终目的,我们需要快速查到出现次数最多的前三个数字,这时候我们可以通过most_common返回出现次数最多的前三个数字

from random import randint
from collections import Counter
data = [randint(0,10) for _ in range(1,11)]

c1 = Counter(data)
print(data)
print(c1)

d =c1.most_common(3)#返回前三数显次数最多的数据
print(d)

在这里插入图片描述

怎么样,你学会了吗?

猜你喜欢

转载自blog.csdn.net/caidewei121/article/details/87936186