Dans Parcourez toutes les combinaisons de valeurs à partir d'un nombre ARBITRAIRE de listes J'ai posté une réponse qui nécessitait l'insertion d'une liste dans une autre liste de listes. La fonction InsertInto décompresse la liste insérée en éléments, ce qui n'est pas ce que je veux. J'ai utilisé une instruction d'affectation à l'élément situé au-delà de la fin de la liste, qui insère la liste en tant qu'élément. Un autre choix consiste à envelopper la liste dans une autre liste avant de l'insérer (afin qu'elle décompresse la liste enveloppée et insère l'original.)
Existe-t-il une meilleure façon d’insérer une liste dans une liste ? result et p sont tous deux des listes.
résultat [ N articles ( résultat ) + 1 ] = p est un peu verbeux mais fonctionne et semble assez clair que p est stocké juste après le dernier élément de la liste. Bon pour étendre, mais ne peut pas être inséré ailleurs.
résultat={"a"};
p={"b","c"};
résultat[N éléments (résultat) + 1] = p; // verbeux, mais l'intention est claire
Afficher le résultat);
/* :
résultat = {"a", {"b", "c"}} ; // bien
Insérer dans (résultat, p) ne fonctionnera pas car il insère les éléments de p, pas p.
résultat={"a"};
p={"b","c"};
insertinto( résultat, p ) ; // a l'air bien, mais...
Afficher le résultat);
/* :
résultat = {"a", "b", "c"} ; // pas ce que je veux
insertinto( résultat, evallist( { p } ) ) fonctionne, mais semble moins lisible que la mission. Peut insérer n'importe où mais fait une copie supplémentaire.
résultat={"a"};
p={"b","c"};
insertinto( résultat, evallist( { p } ) ) ; // fait une copie supplémentaire de la liste et est difficile à lire
Afficher le résultat);
/* :
résultat = {"a", {"b", "c"}} ; // bien : ce que je veux
Oui. J'ai utilisé l'approche evallist() et j'ai toujours l'impression qu'elle a besoin d'un commentaire pour l'expliquer. Dans mon code d'origine (lien en haut), je continue de changer p entre les insertions, il ne peut donc pas simplement insérer une référence à p.
Je pourrais l'utiliser la prochaine fois. Cela semble plus simple, même s'il utilise une structure de données plus compliquée (sous les couvertures), et comme je génère déjà un index avec nitems(...)+1 ... oui, cela pourrait être le meilleur choix.
Ce n'est pas une solution directe mais plutôt une solution de contournement. J'ai tendance à utiliser des tableaux associatifs, similaires à ce que @pmroz suggéré dans votre lien.
FWIW Je le fais toujours de la manière EvalList() dans votre 2ème exemple. Je suppose que vous pourriez le faire de cette façon, et ne pas évaluer jusqu'à ce que vous le vouliez/en ayez besoin... je ne sais pas si cela vous rapporte beaucoup (?)
result = {"a"};
p = {"b", "c"};
Insert Into( result, {p} ); //don't evaluate p here... but of course p is non-static
show(result[2][1]); //can still access elements of p if desired
Show( Eval List( result ) ); //or can eval to see the whole thing
