如何在Golang中按索引交换值

问题描述

在python的numpy中,可以像这样轻松地通过列表中的索引交换值:

a[[2,3,5]] = a[[5,2,3]]

有没有在Golang中实现此功能的好方法。

解决方法

Go没有像这样的精美索引;您能做的最接近的是

a[2],a[3],a[5] = a[5],a[2],a[3]

使用常规索引和常规tuple assignment

,

在Go [...] [中是否有实现该功能的方法?井雷]

不。 Go不为此提供语法。 请注意,就地置换是一个很难解决的问题(numpy也可能根本不这样做)。

复制并置换。

,

如果您想要类似的东西,可以过度设计一些解决方案,但会产生很多问题和处理方式

要使您了解我的意思,请参阅此Go PlayGround Go将Slices用作参考,因此创建了一个可以交换的函数,您会得到类似的东西

package main

import (
    "errors"
    "fmt"
    "strings"
    "strconv"
)

func main() {
    a := []int{1,2,3,4,5,6}
    err := swap(a,"1,5=>0,4")
    fmt.Println(a,err)
}

func swap(arr []int,str string) error {
    parts := strings.Split(str,"=>")
    if len(parts) != 2 {
        return errors.New("Invalid Input")
    }

    leftIndices := strings.Split(parts[0],",")
    rightIndices := strings.Split(parts[1],")

    if len(leftIndices) != len(rightIndices) {
        return errors.New("Swap Indices not Balanced")
    }
    
    fmt.Println(leftIndices,rightIndices)

    for i := 0; i < len(leftIndices); i++ {
        i1,_:= strconv.Atoi(leftIndices[i])
        i2,_:= strconv.Atoi(rightIndices[i])

        arr[i1],arr[i2] = arr[i2],arr[i1]
        fmt.Println(arr)
    }
    return nil
}

即使是这样,我也需要处理很多情况(尽管仍然有一些未得到处理),使某些东西通用将需要更多的检查和复杂性

使用类似

这样的内置语法会更容易
a[0],a[1],a[2] = a[3],a[4],a[5]

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...