如何在 Golang 中按索引交换值
how to swap values by index in 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.
Is there a good way to implement this function in Go[...][? emph mine]
没有。 Go 没有为此提供语法。
请注意,inplace 排列是一个难题(并且可能 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,3,5=>0,2,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]
在 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.
Is there a good way to implement this function in Go[...][? emph mine]
没有。 Go 没有为此提供语法。 请注意,inplace 排列是一个难题(并且可能 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,3,5=>0,2,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]