Dans Itérer à travers toutes les combinaisons de valeurs du 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 déclaration d'affectation à l'élément un 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 de décompresser la liste encapsulée et d'insérer 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 éléments ( 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 insérer 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 l'affectation. Peut insérer n'importe où mais en 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 difficile à lire
Afficher le résultat);
/ *:
résultat = {"a", {"b", "c"}}; // bien: ce que je veux
FWIW Je le fais toujours à 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 ... pas sûr que cela vous achète 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

Pas une solution directe, mais plutôt comme un travail autour, j'ai tendance à utiliser des tableaux associatifs, similaires à ce que @pmroz suggéré dans votre lien.
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 puisque je génère déjà un index avec nitems (...) + 1 ... oui, c'est peut-être le meilleur choix.
Oui. J'ai utilisé l'approche evallist() et j'ai toujours l'impression qu'il faut un commentaire pour 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.