F # insérer / supprimer un élément de la liste
Comment dois-je aller sur la suppression d'un élément donné dans une liste? Par exemple, dire que j'ai la liste ['A'; 'B'; 'C'; 'D'; 'E']
et que vous souhaitez supprimer l'élément à l'indice 2 pour produire la liste ['A'; 'B'; 'D'; 'E']
? Je l'ai déjà écrit le code suivant qui accomplit la tâche, mais il semble plutôt inefficace pour traverser le début de la liste quand je connais déjà l'index.
let remove lst i =
let rec remove lst lst' =
match lst with
| [] -> lst'
| h::t -> if List.length lst = i then
lst' @ t
else
remove t (lst' @ [h])
remove lst []
let myList = ['A'; 'B'; 'C'; 'D'; 'E']
let newList = remove myList 2
Sinon, comment dois-je insérer un élément à une position donnée? Mon code est similaire à l'approche ci-dessus et probablement inefficace.
let insert lst i x =
let rec insert lst lst' =
match lst with
| [] -> lst'
| h::t -> if List.length lst = i then
lst' @ [x] @ lst
else
insert t (lst' @ [h])
insert lst []
let myList = ['A'; 'B'; 'D'; 'E']
let newList = insert myList 2 'C'
source d'informationauteur Timothy
Vous devez vous connecter pour publier un commentaire.
Semble la plus idiomatique (pas de queue récursive):
F# les listes sont individuellement des listes liées, de sorte que vous n'avez pas accès indexé. Mais la plupart du temps, vous n'en avez pas besoin. La majorité des indexé opérations sur les tableaux sont itération de l'avant vers l'extrémité, qui est exactement l'opération la plus courante sur immuable listes. Il est aussi assez fréquent pour ajouter des éléments à la fin d'un tableau, ce qui n'est pas l'opération la plus efficace sur individuellement des listes liées, mais la plupart du temps, vous pouvez utiliser le bouton "cons et inverser" l'idiome ou l'utilisation d'un immuable de la file d'attente pour obtenir le même résultat.
Tableaux et ResizeArrays sont vraiment le meilleur choix si vous avez besoin d'un accès indexé, mais ils ne sont pas immuables. Une poignée de immuable des structures de données comme les Vlist vous permettent de créer une liste de données structures de soutien O(1) cons et O(log n) indexés à accès aléatoire si vous en avez vraiment besoin.
La suppression de l'élément à l'index spécifié n'est pas un fonctionnement normal dans la programmation fonctionnelle - c'est pourquoi il semble difficile de trouver la bonne mise en œuvre de ces opérations. En programmation fonctionnelle, vous aurez généralement le processus de la liste élément par élément en utilisant la récursivité, ou de mettre en œuvre le traitement en termes de niveau supérieur déclarative des opérations. Peut-être si vous pouviez clarfiy quelle est votre motivation, nous pouvons donner une meilleure réponse.
De toute façon, pour mettre en œuvre les deux opérations que vous souhaitiez, vous pouvez utiliser les fonctions d'ordre supérieur (qui traverse l'ensemble de la liste un peu de temps, car il n'y a vraiment pas de bonne façon de le faire sans de la traversée de la liste):
Pour insérer l'élément à l'index spécifié, vous pouvez écrire:
Toutefois, comme indiqué plus haut - sauf si vous avez de très bonnes raisons pour utiliser ces fonctions, vous devriez probablement envisager de décrire vos objectifs de façon plus générale et à l'utilisation d'une alternative (plus fonctionnelle de la solution.
Si vous avez besoin d'un accès aléatoire dans une liste, pensez à utiliser
System.Collections.Generic.List<T>
ouSystem.Collections.Generic.LinkedList<T>
au lieu d'un F# liste.Celui-ci contient un peu de vérification des erreurs ainsi
Permet d'aller dans le ventre et expliquer le code
Et si vous n'aimez pas l'idée de tout simplement revenir à la liste initiale sur indexOutOfRange - envelopper le retour en quelque chose de
Je pense que cela devrait être bien plus rapidement que Juliette ou Tomas proposition, mais plus certainement Mauricio du commentaire est de frapper la maison. Si l'on doit supprimer ou supprimer des éléments à d'autres structures de données semblent un meilleur ajustement.
Je sais que cela a été ici pendant un certain temps maintenant, mais juste eu à faire à quelque chose comme ça récemment et je suis venu avec cette solution, peut-être qu'il n'est pas le plus efficace, mais c'est sûrement le plus court idiomatiques code que j'ai trouvé pour qu'il
La
List.Indexed
renvoie une liste de tuples qui sont dans la liste et de l'élément réel dans cette position après que tout ce qu'il faut est de filtrer l'un tuple correspondant à l'entrée d'index et d'obtenir de l'article réel par la suite.J'espère que cela aide quelqu'un qui n'est pas extrêmement préoccupé par l'efficacité et veut brève code