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.
3 Réponses :
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 .
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 :)
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.
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 }
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