我想以不区分大小写的方式合并两个字符串集合:
grp mean_size sd_size rows
<chr> <dbl> <dbl> <chr>
1 last_group 42330.5 16866.59 11:18
2 others 23597.9 13521.32 1:10
这是一次尝试,但它不起作用......
string_collection1 = {"hello","buddy","world","ciao"}
string_collection2 = {"Hello","Buddy","holly","Bye", "bYe"}
merged_string_collection = merge_case_insensitive(string_collection1,string_collection2) --> {"hello","buddy","world","holly","bye","ciao"}
答案 0 :(得分:1)
它不起作用,因为您使用==来比较两个区分大小写的字符串。
您可以执行string.lower(s1) == string.lower(s2)
之类的操作来解决此问题。
编辑:
由于你自己无法弄清楚其余部分,这里有一些代码:
local t1 = {"hello","buddy","world","ciao"}
local t2 = {"Hello","Buddy","holly","Bye", "bYe"}
local aux_table = {}
local merged_table = {}
for k,v in pairs(t1) do
aux_table[v:lower()] = true
end
for k,v in pairs(t2) do
aux_table[v:lower()] = true
end
for k,v in pairs(aux_table) do
table.insert(merged_table, k)
end
merged_table
现在包含两个输入表中每个单词的小写版本。
现在将它倒入一个带有任意数量输入表的函数中,然后就完成了。
我们在这里做了什么:我们使用这些表中每个单词的小写版本并将它们存储在列表中。 aux_table[string.lower("Hello")]
会将与aux_table[string.lower("hello")]
相同的值编入索引。因此,即使一个单词有多个变体,我们最终会为每个单词输入一个条目。
使用这些键为我们节省了比较字符串和在独特单词和其他单词之间进行分类的麻烦。
答案 1 :(得分:1)
要获得一个包含来自其他两个表的所有字符串的表(不考虑大小写),您需要这样的内容:
function merge_case_insensitive(t1,t2)
local ans = {}
for _,v in pairs(t1) do ans[v:lower()] = true end
for _,v in pairs(t2) do ans[v:lower()] = true end
return ans
end
string_collection1 = {"hello","buddy","world","ciao"}
string_collection2 = {"Hello","Buddy","holly","Bye", "bYe"}
merged_string_collection = merge_case_insensitive(string_collection1,string_collection2)
for k in pairs(merged_string_collection) do print(k) end
编辑:如果你想要一个数组结果(不添加另一个迭代)
function merge_case_insensitive(t1,t2)
local ans = {}
local
function add(t)
for _,v in pairs(t) do
v = v:lower()
if ans[v] == nil then ans[#ans+1] = v end
ans[v] = true
end
end
add(t1)
add(t2)
return ans
end
string_collection1 = {"hello","buddy","world","ciao"}
string_collection2 = {"Hello","Buddy","holly","Bye", "bYe"}
merged_string_collection = merge_case_insensitive(string_collection1,string_collection2)
for _,v in ipairs(merged_string_collection) do print(v) end
答案 2 :(得分:1)
我们可以通过简单地迭代两个表,并存储一个临时字典来检查我们已经找到的单词,如果还没有,将它们放入我们的新数组中,我们可以做到这一点:
function Merge(t1, t2)
local found = {} --Temporary dictionary
local new = {} --New array
local low --Value to store low versions of words in later
for i,v in ipairs(t1) do --Begin iterating over table one
low = v:lower()
if not found[low] then --If not found yet
new[#new+1] = low --Put it in the new table
found[low] = true --Add it to found
end
end
for i,v in ipairs(t2) do --Repeat with table 2
low = v:lower()
if not found[low] then
new[#new+1] = low
found[low] = true
end
end
return new --Return the new array
end
这种方法不需要第三次迭代,就像Piglet的回答一样,并且不会重新定义一个函数和闭包,并像在tonypdmtr的答案中那样调用它们。