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

2024-01-02

我想要得到的笛卡尔积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]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Go 中实现 Ruby 风格的笛卡尔积 的相关文章

  • 将产生 goroutine 的 golang 方法

    据我所知 如果 goroutine 太忙 它们会阻止其他 goroutine 运行 对我来说 这意味着我的应用程序的性能和响应能力可能取决于我知道哪些库方法将控制其他 goroutine 例如通常是 Read 和 Write 有什么方法可以
  • Go 编译器有窗口化设置选项吗?

    我正在使用 Go 6g 编译 GTK 应用程序 我想知道是否有编译器 链接器选项使其成为 Windows 可执行文件而不是控制台可执行文件 MinGW 有一个 mwindows 选项来实现此目的 目前我必须使用十六进制编辑器手动更改 PE
  • 关于编写惯用的 Golang 的建议

    我正在掌握 Golang 的做事方式 首先是一些示例代码 package main import log os func logIt s string f os OpenFile errors log os O RDWR os O CREA
  • 运行最新版本时没有“最新”消息?

    我正在尝试使用Sparkle https sparkle project org与 Qt Go 的绑定 https github com therecipe qt app 闪光 m import
  • 如何使用 go1.6.2 构建 linux 32 位

    有没有任何组合GOARCH and GOOS我可以设置哪些值来构建 ELF 32 位二进制文 件 GOOS linux and GOARCH 386 更多示例 架构 32 bit gt GOARCH 386 64 bit gt GOARCH
  • 如何读取 UDP 连接直至超时?

    我需要读取 UDP 流量 直到超时 我可以通过在 UDPConn 上调用 SetDeadline 并循环直到出现 I O 超时错误来做到这一点 但这看起来很黑客 基于错误条件的流量控制 下面的代码片段看起来更正确 但并没有终止 在生产中 这
  • 如何在golang中获得两个切片的交集?

    Go 中有没有有效的方法来获取两个切片的交集 我想避免嵌套 for 循环之类的解决方案slice1 string foo bar hello slice2 string foo bar intersection slice1 slice2
  • 所有可能的 GOOS 价值?

    如果我做对了 GOOS在编译源代码时确定 为了更好地支持多个操作系统 我感兴趣的是GOOS可能 当然 Go 是开源的 所以它可能有无限的可能性 所以我真正想要的是一个 通用列表 已知值为 windows linux darwin or fr
  • 仅导出嵌入结构实现的方法子集

    是否可以仅导出嵌入结构实现的方法的子集 这是一种与减少代码复制和粘贴非常不同的方法吗 还有更惯用的方法吗 type A struct func a A Hello fmt Println Hello func a A World fmt P
  • []interface{}{} 中的双大括号是什么意思

    请注意 这是格式为 的双花括号 而不是嵌套花括号 我也不确定这是空接口问题 切片问题还是结构问题 我猜它至少是其中两个的组合 我正在学习 Golang 并且已经达到了空接口 我发现我需要将空接口声明为 interface 或者例如 inte
  • ioutil.ReadFile - 没有这样的文件或目录[重复]

    这个问题在这里已经有答案了 对于以下代码 package main import fmt io ioutil strings func main b err ioutil ReadFile shakespeare txt if err ni
  • 可执行文件不在路径中 - GO

    我正在尝试调用命令提示符的内置命令 但出现了我不明白的错误 func main cmd exec Command del C trial now txt Reboot if needed cmd Stdout os Stdout if er
  • 在 Golang 中生成固定长度的随机十六进制字符串的有效方法?

    我需要生成很多固定长度的随机十六进制字符串 我找到这个解决方案golang中如何生成固定长度的随机字符串 https stackoverflow com a 31832326 710955 我正在做这样的事情 const letterByt
  • 为什么 Go 中不允许在包级别声明短变量?

    这是允许的 package main var a 3 但这不是 package main a 3 为什么不 为什么不能将函数外部的短变量声明视为没有类型的常规声明 只是为了简化解析 根据伊恩 兰斯 泰勒的说法这个线程 https group
  • 不支持的 Perl 语法:`(?<`

    我想解析 cmd gpg list keys 的结果以将其显示在浏览器上 cmd输出是这样的 pub rsa3072 2021 08 03 SC expires 2023 08 03 07C47E284765D5593171C18F00B1
  • Golang:从文本文件中替换字符串中的换行符时出现问题

    我一直在尝试读取一个文件 然后将读取的材料放入字符串中 然后字符串将按行分割成多个字符串 absPath filepath Abs Go input txt data err ioutil ReadFile absPath if err n
  • go build 不断抱怨:go.mod 有 post-v0 模块路径

    Go 1 11 发布后 我一直在尝试将我的存储库移动到 Go 模块 方法是添加go mod文件在其根目录下 我的根库之一my host root其版本为17 0 1 所以我在其中写道go mod file module my host ro
  • Golang 从管道读取读取大量数据

    我正在尝试读取一个正在被焦油化 流式传输到标准输入的存档 但我正在以某种方式读取far管道中的数据多于 tar 发送的数据 我像这样运行我的命令 tar cf somefolder my go binary 源代码是这样的 package
  • 在 Go 中,如何将函数的 stdout 捕获到字符串中?

    例如 在 Python 中 我可以执行以下操作 realout sys stdout sys stdout StringIO StringIO some function prints to stdout get captured in t
  • 正则表达式不匹配

    我正在尝试以下代码 d byte x01 x00 x00 x00 x00 x00 x00 x00 x00 x00 x00 x80J x13 x80SQ x80L xe0 x80 x92 x80L x80H xe0 r regexp Must

随机推荐

  • Angular 2.x 在 body 标签上绑定类

    由于 Angular 2 x 是在主体内部引导的 我该如何添加 class fixed isFixed 在 body 标签上 在我的应用程序之外
  • 匹配不带引号的逗号的正则表达式

    我正在使用 Clojure 所以这是在 Java 正则表达式的上下文中 这是一个示例字符串 a ab cd efg b ab def egf c Conjecture 重要的位是每个字符串后面的逗号 我希望能够使用Java的replaceA
  • Go 中的简单工作池

    我正在尝试在 go 中实现一个简单的工作池 但不断遇到问题 我想做的就是让一定数量的工人先完成一定数量的工作 然后再做更多的工作 我正在使用的代码类似于 jobs make chan imageMessage 1 results make
  • 在 jquery 验证中实现 require_from_group

    我正在尝试获取一组输入来进行验证 因此 如果任何输入为空 它将在输入下方显示一条消息 我一直在关注另一个SO答案here https stackoverflow com a 2589646 571723 4 个输入将不会验证 当没有提交数据
  • SQL Server 2008 上 varbinary(max) 文件流的长度

    有没有一些有效的方法来获取 varbinary max filestream 列中的数据长度 我只找到了转换为 varchar 然后调用 LEN 函数的示例 SELECT length DATALENGTH Name Name FROM P
  • 如何在价格中添加尾随零?

    我有一个返回产品价格的脚本 但是 价格可能包含也可能不包含尾随零 所以有时我可能会258 22其他时候我可能有258 2 在后一种情况下 我需要添加尾随零 我该怎么做呢 你可以使用javascripttoFixed方法 source htt
  • 如何在fragment中设置setContentView

    我正在尝试在片段中调用库 但不知道如何在片段中设置它我已在主活动中完成它 但在片段中设置 setContentView 时出现错误 编译依赖 compile com github medyo android about page 1 0 2
  • Android Studio 图像资源启动器图标背景颜色

    我的应用程序有一个 png 徽标 它没有背景 当我将其作为图像资源添加到 android studio 时 我被迫有背景 十六进制字段不接受 8 位颜色代码 仅接受 6 位 有没有办法让背景不可见 要使背景透明 请设置shape as No
  • MotionLayout 儿童拦截触摸事件的问题

    我的主布局中有一个根容器的 MotionLayout 里面还有其他的景色 其中之一是框架布局 包含一个片段 该片段是一个页面 由 NestedScrollView 等组成 MotionLayout 具有仅水平滑动的 OnSwipe 而 Ne
  • 具有可变函数参数的 C++ 多态性

    我正在与您分享一个使用可变参数函数参数的类遇到的问题 它是下面代码中所示的 Thread 类 它是 std thread 的包装器 以便使用函数模式 我想在这个函数中使用多态性 将 Thread 类继承到一个新类 Functor 中 但是
  • 将 Excel 电子表格导入 Access - [hh]:mm:ss 的格式问题

    我需要将 Excel 电子表格导入 Microsoft Access 我有一个格式为 h mm ss 的列 当我使用 Access 导入它时 我已指定该列采用日期 时间格式 但它显示不正确 例如 在 Excel 中 它会显示 452 32
  • git 远程名称中哪些字符是非法的?

    git 远程名称中哪些字符是非法的 我在 git 文档中没有找到它 我在文档中也没有找到任何内容 那么我们就来看看源码吧 当您尝试添加具有无效名称的遥控器或将遥控器重命名为无效名称时 您将收到一条错误消息 例如 致命 foo bar 不是有
  • 如何向 D3.js 图表添加固定范围垂直线

    我正在尝试在现有折线图上添加一条垂直线 我的数据如下所示 PC 列是计算出的百分比 图表上的垂直线应从 0 延伸到 100 var data Month 2014 06 PC 38 items 72 Month 2014 07 PC 33
  • 如何动态访问 strings.xml 中的值?

    我想做的是从中获取特定文本strings xml动态地 我认为这将涉及动态访问对象变量 将会有一个类似的函数 public void getDynamicString int level text setText R string leve
  • 如何解释 jag 中的某些语法(n.adapt、update..)?

    我对 jag 中的以下语法感到非常困惑 例如 n iter 100 000 thin 100 n adapt 100 update model 1000 progress bar none 目前我认为 n adapt 100意味着您将前 1
  • 如何链接到 /usr/local/lib 上的 libc++?

    我试图提供 L usr local lib tried nostdinc 尝试设置DYLD LIBRARY PATH and DYLD FALLBACK LIBRARY PATH but otool总是给我 otool L sample s
  • 作为服务运行时,TFS 构建代理无法连接到 TFS 2017 中的 HTTPS git

    我们在服务器上使用内部证书 我已按照以下步骤操作 https blogs msdn microsoft com tfssetup 2016 12 19 error ssl certificate problem unable to get
  • 如何在 CloudFormation 模板中创建一些随机或唯一值?

    有没有办法在 CloudFormation 模板中创建某种随机或唯一值 为什么我需要这个 在我们的模板中 我们有许多自定义命名的资源 例如AWS AutoScaling LaunchConfiguration与指定的LaunchConfig
  • P 值、显着性水平和假设

    我对 p 值的概念感到困惑 一般来说 如果 p 值大于 alpha 通常为 0 05 我们就无法拒绝原假设 如果 p 值小于 alpha 我们就拒绝原假设 据我了解 如果 p 值大于 alpha 则两组之间的差异只是来自采样误差或偶然 到目
  • 在 Go 中实现 Ruby 风格的笛卡尔积

    我想要得到的笛卡尔积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