问题描述
在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]