将元素的频率计入Lua中的数组

时间:2013-11-14 11:19:38

标签: lua lua-table

我在Lua有一张桌子:

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

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

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

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

> function exec(ele,p)
count = 0
for k,v in pairs(p) do
if ele == p[k] then
count = count +1 
end
end
return count
end


> new_table = {}
> for k,v in pairs(p) do
new_table[v] = exec(v,p)
end
> 
> for k,v in pairs(new_table) do
print(k,v)
end
dhone   1
yuvraj  1
kohli   1
sachin  2
dravid  1

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

2 个答案:

答案 0 :(得分:3)

您可以像这样计算频率:

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

这是另一个demo example

答案 1 :(得分: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

上面的metamethod __index将表0作为默认值。