3

我在 Lua 中有一张桌子:

p = {'sachin'、'sachin'、'dravid'、'Dhoni'、'yuvraj'、'kohli'}

我想计算表中每个名称的频率。

test1 = {sachin=2, dravid=1, Dhoni=1, yuvraj=1, kohli=1}

我用很多 for 循环尝试了这个程序。请看我的代码

> 函数 exec(ele,p)
计数 = 0
对于 k,v 成对 (p) 做
如果 ele == p[k] 那么
计数 = 计数 +1
结尾
结尾
返回计数
结尾


> 新表 = {}
> 对于 k,v 成对 (p) 做
新表[v] = exec(v,p)
结尾
>
> 对于 k,v 成对 (new_table) 做
打印(k,v)
结尾
多哈 1
尤拉杰 1
科利 1
萨钦 2
德拉维德 1

我想以更有效的方式做到这一点。我怎样才能做到这一点?

4

2 回答 2

4

你可以这样计算频率:

function tally(t)
  local freq = {}
  for _, v in ipairs(t) do
    freq[v] = (freq[v] or 0) + 1
  end
  return freq
end

这是另一个演示示例

于 2013-11-14T11:45:29.653 回答
1

对于这种简单的情况,使用 metatable 可能有点不必要,只是显示另一个选项:

local mt = {__index = function() return 0 end}
local newtable = {}
setmetatable(newtable, mt)

for _, v in pairs(p) do
    newtable[v] = newtable[v] + 1
end

上面的元方法__index将表格0作为默认值。

于 2013-11-14T12:19:33.880 回答