为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中实现 Ruby 风格的笛卡尔积

在 Go 中实现 Ruby 风格的笛卡尔积

Go
一只萌萌小番薯 2021-09-20 20:56:01
我想得到a, b, c,的笛卡尔积d:a = ['a1']b = ['b1', 'b2']c = ['c1', 'c2', 'c3']d = ['d1']这是Ruby中的代码:e = [b, c, d]print a.product(*e)输出是:[  ["a1", "b1", "c1", "d1"],  ["a1", "b1", "c2", "d1"],  ["a1", "b1", "c3", "d1"],  ["a1", "b2", "c1", "d1"],  ["a1", "b2", "c2", "d1"],  ["a1", "b2", "c3", "d1"]]是否有类似的包或功能可以在 Golang 中做产品?这只是简化版,实际上输入的数据就像 [['a1'], ['b1','b2'], ['c1','c2','c3],['d1'], ['e1',...],...]。
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

如果您需要一组在编译时未知的嵌套索引循环,您可以使用这样的代码。


package main


import "fmt"


// NextIndex sets ix to the lexicographically next value,

// such that for each i>0, 0 <= ix[i] < lens(i).

func NextIndex(ix []int, lens func(i int) int) {

    for j := len(ix) - 1; j >= 0; j-- {

        ix[j]++

        if j == 0 || ix[j] < lens(j) {

            return

        }

        ix[j] = 0

    }

}


func main() {

    e := [][]string{

        {"a1"},

        {"b1", "b2"},

        {"c1", "c2", "c3"},

        {"d1"},

    }

    lens := func(i int) int { return len(e[i]) }


    for ix := make([]int, len(e)); ix[0] < lens(0); NextIndex(ix, lens) {

        var r []string

        for j, k := range ix {

            r = append(r, e[j][k])

        }

        fmt.Println(r)

    }

}

输出是:


[a1 b1 c1 d1]

[a1 b1 c2 d1]

[a1 b1 c3 d1]

[a1 b2 c1 d1]

[a1 b2 c2 d1]

[a1 b2 c3 d1]


查看完整回答
反对 回复 2021-09-20
  • 1 回答
  • 0 关注
  • 191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信