Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在GO中检查切片是否在切片内?_List_Go - Fatal编程技术网

List 如何在GO中检查切片是否在切片内?

List 如何在GO中检查切片是否在切片内?,list,go,List,Go,我有以下代码: func main(){ l1 := []string{"a", "b", "c"} l2 := []string {"a", "c"} //l2 in l1? } 我可以使用循环和标志来检查这一点,但是有没有一种简单的方法可以像python命令“l2 in l1”那样检查l2是否在l1内部?从以下开始,@Mostafa发布了以下内容以检查元素是否在片中: func contains(s []string, e string) bool { for

我有以下代码:

func main(){
    l1 := []string{"a", "b", "c"}
    l2 := []string {"a", "c"}
    //l2 in l1?
}
我可以使用循环和标志来检查这一点,但是有没有一种简单的方法可以像python命令“l2 in l1”那样检查l2是否在l1内部?

从以下开始,@Mostafa发布了以下内容以检查元素是否在片中:

func contains(s []string, e string) bool {
   for _, a := range s {
        if a == e {
            return true
        }
    }
    return false
}
现在是逐个元素检查的问题:

func subslice (s1 []string, s2 []string) bool {
    if len(s1) > len(s2) { return false }
    for _, e := range s1 {
        if ! contains(s2,e) {
            return false
        }
    }
    return true
}
当然,这忽略了重复项,因此还有改进的余地。

@Kabanus的答案是O(mn)时间复杂性。尽管在大范围内速度较慢,但它只要求两个集合的元素具有可比性,这几乎是任何情况下的情况

但是,如果您的数据是可散列的,并且默认情况下最好是可散列的(即可以用作
映射
的键),则使用辅助映射是一种更有效的方法:

package main

import (
    "fmt"
)

type Universe map[string]bool

func NewUniverse(s []string) Universe {
    u:=make(Universe)
    for _,i:=range s {
        u[i]=true
    }
    return u
}

func (u Universe) CountainSet(s []string) bool {
    for _,i:=range s {
        if !u[i] {
            return false
        }
    }
    return true
}

func main() {
    fmt.Println(NewUniverse([]string{"a","b","c"}).CountainSet([]string{"a","c"}))
}
处理重复项非常简单:将map[string]bool更改为map[string]int并比较元素计数


操场:

您似乎正在寻找设置问题集:

在Python中,它将如下所示:

In [1]: l1 = ["a", "b", "c"]

In [2]: l2 = ["a", "c"]

In [3]: set(l2).issubset(l1)
Out[3]: True
package main

import (
    "fmt"

    "github.com/deckarep/golang-set"
)

func sliceToSet(mySlice []string) mapset.Set {
    mySet := mapset.NewSet()
    for _, ele := range mySlice {
        mySet.Add(ele)
    }   
    return mySet
}

func main() {

    l1 := []string{"a", "b", "c"}
    l2 := []string{"a", "c"}

    s1 := sliceToSet(l1)
    s2 := sliceToSet(l2)

    result := s2.IsSubset(s1)

    fmt.Println(result)
}
go中最相似的版本使用如下所示:

In [1]: l1 = ["a", "b", "c"]

In [2]: l2 = ["a", "c"]

In [3]: set(l2).issubset(l1)
Out[3]: True
package main

import (
    "fmt"

    "github.com/deckarep/golang-set"
)

func sliceToSet(mySlice []string) mapset.Set {
    mySet := mapset.NewSet()
    for _, ele := range mySlice {
        mySet.Add(ele)
    }   
    return mySet
}

func main() {

    l1 := []string{"a", "b", "c"}
    l2 := []string{"a", "c"}

    s1 := sliceToSet(l1)
    s2 := sliceToSet(l2)

    result := s2.IsSubset(s1)

    fmt.Println(result)
}

上述方法的时间复杂度为线性时间。issubset本身的时间复杂度是O(n),其中n是我们正在检查的集合的长度,如果是子集,在本例中为
s2
。还有从切片到集合的转换,这也是线性时间。

是的,您需要循环--
l1中的l2
只是对您隐藏循环。如何定义
中的
?同样的订单?顺序不重要?在这种情况下,顺序不重要如果顺序不重要,那么这是一个集合包含另一个集合的问题。如果顺序不重要,它与Python在
中的
不同,因为
['a',c']在['a',b',c']
中的
错误的
请添加算法的时间和内存复杂性以进行比较。