0
votes

comment échanger des valeurs par index dans Golang

En python numpy , on peut facilement échanger des valeurs par index dans une liste comme ceci:

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

Y a-t-il un bon moyen d'implémenter cette fonction dans Golang.


0 commentaires

3 Réponses :


6
votes

Go n'a pas d'indexation sophistiquée comme ça; le plus proche que vous puissiez faire est

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

en utilisant l'indexation régulière et l ' attribution de tuple .


2 commentaires

Et si j'ai un index de longueur variable à échanger. Puis-je le mettre en place? La méthode actuelle que je peux comprendre est d'en faire une copie et de les attribuer à la liste d'origine ...


@ luoshao23 ouais, vous ne pouvez pas faire ça sans temporaire. Go n'allouera pas implicitement des quantités arbitraires de mémoire :)



1
votes

Existe-t-il un bon moyen d'implémenter cette fonction dans Go [...] [? emph le mien]

Non. Go ne fournit pas de syntaxe pour cela. Notez que la permutation inplace est un problème difficile (et probablement numpy ne le fait pas non plus sous le capot).

Copiez et permutez.


0 commentaires

0
votes

Si vous voulez quelque chose de similaire, vous pouvez sur-concevoir une solution, mais cela créera beaucoup de problèmes et de gestion

Pour vous donner une idée de ce que je veux dire, voyez ceci Allez sur PlayGround Go passe Slices comme référence, donc en créant une fonction pour échanger en place et vous obtenez quelque chose comme ça

a[0], a[1], a[2] = a[3], a[4], a[5]

Même pour cela, je dois gérer tant de cas (bien que certains ne soient toujours pas manipulé), rendre quelque chose de générique nécessitera encore plus de vérifications et de complexité

Il sera beaucoup plus facile d'utiliser la syntaxe intégrée comme

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
}


2 commentaires

Votre solution ne semble pas fonctionner. Disons a: = [] int {1, 2, 3, 4, 5, 6} et le swap est "1,3,5 => 5,1,3" < / code>. Le résultat doit être [1, 6, 3, 2, 5, 4] , tandis que votre solution donne [1 4 3 2 5 6]


Oui, comme vous pouvez le voir, il s'échange séquentiellement, il doit être géré avec copie (vous devrez copier les valeurs avant de commencer à conserver les valeurs d'origine), je ne faisais que montrer un petit exemple. Beaucoup de choses doivent encore être traitées comme mentionné dans la réponse