Lua:删除重复元素

12

我正在使用Lua中的表格。

test = {1,2,4,2,3,4,2,3,4,"A", "B", "A"}

我想要删除表格中所有重复的元素。
输出结果应为:

test = {1,2,4,3,"A","B"}

编辑:

我的尝试:

> items = {1,2,4,2,3,4,2,3,4,"A", "B", "A"}
> flags = {}
> for i=1,table.getn(items)  do
if not flags[items[i]] then
      io.write(' ' .. items[i])
      flags[items[i]] = true
   end
>> end
 1 2 4 3 A B>

现在它正常工作了。 感谢回答和评论。


请注意,迄今为止发布的答案都没有处理重复元素本身也是表的情况,因为这也需要对如何比较表给出令人满意的答案。 - TamaMcGlinn
4个回答

26

类似于@Dimitry给出的示例,但只使用一个循环

local test = {1,2,4,2,3,4,2,3,4,"A", "B", "A"}
local hash = {}
local res = {}

for _,v in ipairs(test) do
   if (not hash[v]) then
       res[#res+1] = v -- you could print here instead of saving to result table if you wanted
       hash[v] = true
   end

end

4
不错的缩写。虽然条件中的括号并不是必要的,哈哈 :D - Dmitry Ledentsov
2
@dmitry 谢谢 - 这些括号是我平常使用 C、Perl 和 PHP 时的惯用写法而已 :-P - vogomatix

4
local test = {1,2,4,2,3,4,2,3,4,"A", "B", "A"}

-- make unique keys
local hash = {}
for _,v in ipairs(test) do
    hash[v] = true
end

-- transform keys back into values
local res = {}
for k,_ in pairs(hash) do
    res[#res+1] = k
end

-- 1 2 3 4 A B
for _,v in ipairs(res) do
    print(v)
end

test = res

我认为在PiL书中已经给出了提示,可以从头开始提供一个简单直接的解决方案。

你尝试过什么来解决这个问题?


请看我编辑了我的问题。感谢您的回答。您能否解释一下为什么您 _ ? - Prashant Gaur
我已经编辑了标题,使其可读作为纯文本。下划线不传达额外的信息。你的解决方案原则上与我的相同,只是你没有写回到“test”表句柄。如果您同意,可以考虑接受答案,它解决了您的问题。 - Dmitry Ledentsov
1
当然,我会接受。我只是在进行同样的研究,以用尽可能少的代码解决这个问题。 - Prashant Gaur
res[#res+1] = k 这里的 # 是什么意思?能解释一下吗? - Prashant Gaur
1
它正在查找Lua 5.1表中的最后一个索引。 - vogomatix

3
local xx = {'a','b','c','d','a','d','f','g','a'}
table.sort(xx)
local result = {}

for key,value in ipairs(xx) do
  if value ~=xx[key+1] then
    table.insert(result,value)
  end
end

for key,value in ipairs(result) do
  print(key,value)   
end

1
通常,即使此代码回答了问题,建议简要解释它的作用以及为什么是正确的答案。 - Edson Menegatti

0
项目 = {1,2,4,2,3,4,2,3,4,"A", "B", "A"} 标志 = {} for i=1,table.getn(项目) do if not 标志[项目[i]] then io.write(' ' .. 项目[i]) 标志[项目[i]] = true end end

输出 -

1 2 4 3 A B>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接