3

Luaにテーブルがあります:

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

table 内の各名前の頻度をカウントしたい。

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

多くの for ループでこのプログラムを試しました。コードを参照してください。

> 関数 exec(ele,p)
カウント = 0
for k,v inpair(p) do
ele == p[k] の場合
カウント = カウント +1
終わり
終わり
リターンカウント
終わり


> new_table = {}
> 対 (p) の k,v に対して
new_table[v] = exec(v,p)
終わり
>
> ペアの k,v に対して (new_table) do
print(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 に答える