问题3:如何统计序列中元素的出现频度

例1:从随机列表中,找到找到出现次数最高的3个元素,及出现次数

方法一:

from random import randint
date = [randint(0, 20) for _ in range(100)]
c = dict.fromkeys(date, 0)
for x in date:
c[x] += 1
c2 = sorted(c.items(), key = lambda k:k[1])
c3 = c2[len(c2)-3:]
print(c3)
  1. date = [randint(0, 20) for _ in range(100)]:在0~20间,随机生产一个长度100的列表;
  2. dict.fromkeys(date, 0):以列表的值(不重复使用)做key,以0做值,生产字典;
  3. for x in date:
    c[x] += 1:统计随机list中各元素数量;
  4. c2 = sorted(c.items(), key = lambda k:k[1]):对统计的元素数量进行排序,以[(key,value)]形式;
  5. c3 = c2[len(c2)-3:]:返回最后3组数据,为目标结果;

方法二:使用collections下的Counter对象

from collections import Counter
from random import randint
date = [randint(0, 20) for _ in range(100)]
c1 = Counter(date)
c2 = c1.most_common(3)
print(c2)
  1. Counter(date):直接得到date中元素种类和数量,Counter({0: 7, 14: 7, 15: 7, 17: 7, 13: 6, 11: 6, 12: 5, 6: 5, 8: 5, 9: 5, 20: 4, 16: 4, 1: 4, 19: 4, 7: 4, 3: 4, 2: 4, 18: 3, 5: 3, 4: 3, 10: 3})
  2. c1.most_common(3),返回出现频率最多的3组数据;

例2:统计一片英文文章中,出现频度最高的10个单词,及出现次数

import re

txt = open('文件x').read()

c = Counter(re.split('\W+', txt))

c1 = c.most_common(10)
print(c1)
  1. txt = open('文件x').read():打开文件x;
  2. Counter(re.split('\W+', txt)):对txt数据进行分割后,得到一个list,并将list内元素种类和数量进行统计;
  3. c.most_common(10):将字典c1内数量最多的10个元素;

 

 

 

 

转载于:https://www.cnblogs.com/volcao/p/8727455.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用动态链表实现字符的频度统计可以通过以下步骤实现: 1. 定义一个结构体作为链表的节点,包含字符、出现次数和指向下一个节点的指针。 2. 定义一个头结点指针和一个尾结点指针,初始时头结点和尾结点都指向 NULL。 3. 读入字符序列,遍历每个字符并在链表查找是否已存在该字符。如果存在,则将该字符对应的节点的出现次数加一,否则在链表末尾插入一个新节点。 4. 在链表插入新节点时,需要遍历整个链表找到插入位置。因此,该实现方法的时间复杂度为 O(n)。 5. 链表节点的顺序可以按照出现次数从大到小排列,这样可以方便地获取出现次数最多的字符。 Redis zset内部实现也可以使用类似的方法。在 Redis ,zset 是一个有序集合,可以存储多个元素,并且每个元素都有一个对应的分数。在该实现,可以将字符作为元素出现次数作为分数。具体实现步骤如下: 1. 通过 Redis 提供的 zadd 命令向 zset 添加元素,将字符作为元素出现次数作为分数。 2. 通过 Redis 提供的 zrange 命令获取 zset 元素,可以指定元素的范围和排序方式。在该实现,可以按照分数从大到小排序,获取出现次数最多的字符。 3. 在 zset 插入新元素时,需要检查该元素是否已存在,如果存在则将分数加一,否则添加一个新元素。在 Redis 内部,zset 使用跳跃表实现,插入元素的时间复杂度为 O(log n)。 综上所述,使用动态链表实现字符的频度统计和 Redis zset 内部实现都可以实现该功能,但是实现方式略有不同。动态链表实现比较简单,但时间复杂度较高;Redis zset 内部实现使用跳跃表实现,时间复杂度较低,但需要使用 Redis 提供的命令来操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值