我想要得到的笛卡尔乘积a,b,c,d:
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’,…],…]。
如果您需要一个编译时未知的嵌套索引循环集,则可以使用这样的代码。
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]