当前位置: 首页 > news >正文

Lua 第11部分 小插曲:出现频率最高的单词

       在本章中,我们要开发一个读取并输出一段文本中出现频率最高的单词的程序。像之前的小插曲一样,本章的程序也十分简单但是也使用了诸如迭代器和匿名函数这样的高级特性。

       该程序的主要数据结构是一个记录文本中出现的每一个单词及其出现次数之间关系的表。使用这个数据结构,该程序可以完成 3 个主要任务。

(1)读取文本并计算每一个单词的出现次数。
(2)按照出现次数的降序对单词列表进行排序。
(3)输出有序列表中的前 n 个元素。

        要读取文本,可以遍历每一行,然后遍历每一行的每一个单词。对于我们读取的每一个单词,增加对应计数器的值:

local  counter = {}for line in io.lines() dofor word in string.gmatch(line, "%w+") docounter[word] = (counter[word] or 0) + 1end
end

这里,我们使用模式"%w+"来描述“单词”, 也就是一个或多个字母或数字。

        下一步就是对单词列表进行排序。不过,就像一些有心的读者可能已经注意到的那样,我们并没有可以用来排序的单词列表。尽管如此,使用表 counter 中作为键的单词来创建一个列表还是很简单的:

local words = {}		-- 文本中所有单词的列表for w in pairs(counter) dowords[#words + 1] = w
end

一旦有了单词列表,就可以使用函数 table.sort 对其进行排序 :

table.sort( words, function (w1, w2)return counter[w1] > counter[w2] orcounter[w1] == counter[w2] and w1 < w2
end )

 统计单词出现频率的程序完整的代码如下:

local  counter = {}for line in io.lines() dofor word in string.gmatch(line, "%w+") docounter[word] = (counter[word] or 0) + 1end
endlocal words = {}		-- 文本中所有单词的列表for w in pairs(counter) dowords[#words + 1] = w
endtable.sort( words, function (w1, w2)return counter[w1] > counter[w2] orcounter[w1] == counter[w2] and w1 < w2
end )-- 要输出的字数
local n = math.min(tonumber(arg[1]) or math.huge, #words)for i = 1, n doio.write(words[i], "t", counter[words[i]], "\n")
end

        最后一个循环输出了结果,也就是前 n 个单词及它们对应的计数值。这个程序假定第 1个参数是要输出单词的个数;默认情况下,如果没有参数,它会输出所有的单词 。

相关文章:

  • 《MySQL 技术内幕-innoDB 存储引擎》笔记
  • 顶会招牌idea:机器学习+组合优化 优秀论文合集
  • 博物馆除湿控湿保卫战:M-5J1R 电解除湿科技如何重塑文物守护的未来
  • 服务器数据备份,服务器怎么备份数据呢?
  • 现代多核调度器的本质 调度三重奏
  • 设计模式--桥接模式详解
  • 1.1 道路结构特征
  • 驱动开发硬核特训 · Day 22(上篇): 电源管理体系完整梳理:I2C、Regulator、PMIC与Power-Domain框架
  • c++多线程初识
  • apkpure 谷歌插件 下载的apk包
  • RISC-V MCU定时器架构与低功耗设计
  • OpenStack私有云详细介绍
  • 洞悉 NGINX ngx_http_access_module基于 IP 的访问控制实战指南
  • Linux 在个人家目录下添加环境变量 如FLINK_PROPERTIES=“jobmanager.rpc.address: jobmanager“
  • 常用第三方库:shared_preferences数据持久化
  • SpringBoot知识日常巩固(一)
  • 德州仪器(TI)—TDA4VM芯片详解(1)—产品特性
  • Linux—— 版本控制器Git
  • 织梦dedecms调用会员详细字段信息
  • Vue3 + OpenLayers 开发教程 (六)WebGL渲染优化
  • 扎克伯格怕“错过风口”?Meta AI数字伴侣被允许与未成年人讨论不当话题
  • 马上评丨机械停车库成“僵尸库”,设计不能闭门造车
  • 油电同智,安全超充!从上海车展看中国汽车产业先发优势
  • CSR周刊:李宁打造世界地球日特别活动,珀莱雅发布2024年度可持续发展报告
  • 上海首个航空前置货站落户松江综合保税区,通关效率可提升30%
  • 哈马斯同意释放剩余所有以色列方面被扣押人员,以换取停火五年