Dictionary 从切片映射中删除重复项

Dictionary 从切片映射中删除重复项,dictionary,go,slice,Dictionary,Go,Slice,我有一张切片图,需要从中删除重复的部分。我想我已经接近解决方案了,但是我遗漏了一些我不能完全理解的东西 预期输出:map[key1:[1 2 3]key2:[1 2 3]] 实际输出:map[key2:[1 2 3]] 主程序包 输入“fmt” func main(){ x:=make(映射[字符串][]字符串) 键:=make(映射[字符串]布尔) 结果:=make(映射[string][]string) x[“key1”]=追加(x[“key1”],“1”) x[“key1”]=追加(x[“

我有一张切片图,需要从中删除重复的部分。我想我已经接近解决方案了,但是我遗漏了一些我不能完全理解的东西

预期输出:
map[key1:[1 2 3]key2:[1 2 3]]

实际输出:
map[key2:[1 2 3]]

主程序包
输入“fmt”
func main(){
x:=make(映射[字符串][]字符串)
键:=make(映射[字符串]布尔)
结果:=make(映射[string][]string)
x[“key1”]=追加(x[“key1”],“1”)
x[“key1”]=追加(x[“key1”],“1”)
x[“key1”]=追加(x[“key1”],“2”)
x[“key1”]=追加(x[“key1”],“3”)
x[“key1”]=追加(x[“key1”],“3”)
x[“键2”]=追加(x[“键2”],“1”)
x[“键2”]=追加(x[“键2”],“2”)
x[“键2”]=追加(x[“键2”],“2”)
x[“键2”]=追加(x[“键2”],“3”)
格式打印LN(x)
对于k,e:=范围x{
对于u,v:=范围e{
如果u,val:=键[v];!val{
键[v]=真
结果[k]=追加(结果[k],v)
}
}
}
fmt.Println(结果)
}

操场上的示例:

您希望所有切片都单独处理。例如,您希望从
x[“key1”]
表示的切片中删除重复项,并且希望从
x[“key2”]
表示的切片中删除重复项。这意味着您应该在处理新切片时“重置”
,但您只需初始化它一次

因此,如果(可能的话)您先处理
x[“key1”]
,然后继续处理
x[“key2”]
,因为
x[“key1”]
包含
x[“key2”]
所包含的所有元素,将找不到新的元素,因此
“key2”
将完全从结果中删除

只需在循环内的每个切片之前初始化

for k, e := range x {
    keys := make(map[string]bool)
    for _, v := range e {
        if _, val := keys[v]; !val {
            keys[v] = true
            result[k] = append(result[k], v)
        }
    }
}
这样,输出将是(在上尝试):

还请注意,您可以使用创建初始贴图的紧凑方式,如下所示:

x := map[string][]string{
    "key1": {"1", "1", "2", "3", "3"},
    "key2": {"1", "2", "2", "3"},
}
由于在
映射中使用
bool
,您可以简单地检查这样的现有元素(因为使用不在其中的键对映射进行索引会导致映射值类型的零值,对于
bool
false
,正确地告诉元素不在映射中):

试一试这个


你可以在这里阅读更多关于这方面的内容:;是的,这很有道理。谢谢你指出这一点。我盯着它看了太久,看不见它:)
x := map[string][]string{
    "key1": {"1", "1", "2", "3", "3"},
    "key2": {"1", "2", "2", "3"},
}
if !keys[v] {
    keys[v] = true
    result[k] = append(result[k], v)
}