我在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
我想以更有效的方式做到这一点。我怎样才能做到这一点?
答案 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
作为默认值。