In Durchlaufen Sie alle Wertekombinationen aus einer beliebigen Anzahl von Listen Ich habe eine Antwort gepostet, die das Einfügen einer Liste in eine andere Liste von Listen erforderte. Die Funktion „InsertInto“ entpackt die eingefügte Liste in Elemente, was ich nicht möchte. Ich habe eine Zuweisungsanweisung für das Element eins hinter dem Ende der Liste verwendet, wodurch die Liste als Element eingefügt wird. Eine andere Möglichkeit besteht darin, die Liste vor dem Einfügen in eine andere Liste einzuschließen (damit die umschlossene Liste entpackt und das Original eingefügt wird).
Gibt es eine bessere Möglichkeit, eine Liste in eine Liste einzufügen? result und p sind beide Listen.
Ergebnis [ N Artikel ( Ergebnis ) + 1 ] = P ist etwas wortreich, funktioniert aber und scheint ziemlich klar zu sein, dass p direkt nach dem letzten Element in der Liste gespeichert wird. Gut zum Erweitern, kann aber nirgendwo anders eingefügt werden.
result={"a"};
p={"b","c"};
result[N Items( result ) + 1] = p; // wortreich, aber die Absicht ist klar
zeige Ergebnis);
/*:
Ergebnis = {"a", {"b", "c"}}; // Gut
Einfügen in( Ergebnis, p ) wird nicht funktionieren, weil es die Elemente von p einfügt, nicht p.
result={"a"};
p={"b","c"};
insertinto( result, p ); // sieht richtig aus, aber...
zeige Ergebnis);
/*:
Ergebnis = {"a", "b", "c"}; // nicht das, was ich will
insertinto( result, evallist( { p } ) ) funktioniert, scheint aber weniger lesbar zu sein als die Aufgabe. Kann überall eingefügt werden, erstellt aber eine zusätzliche Kopie.
result={"a"};
p={"b","c"};
insertinto( result, evallist( { p } ) ); // erstellt eine zusätzliche Kopie der Liste und ist schwer lesbar
zeige Ergebnis);
/*:
Ergebnis = {"a", {"b", "c"}}; // gut: was ich will
Ja. Ich habe den evallist()-Ansatz verwendet und habe immer das Gefühl, dass es eines Kommentars zur Erklärung bedarf. In meinem ursprünglichen Code (Link oben) ändere ich p ständig zwischen den Einfügungen, sodass nicht einfach ein Verweis auf p eingefügt werden kann.
Das könnte ich beim nächsten Mal nutzen. Es sieht einfacher aus, auch wenn es eine kompliziertere (unter der Decke liegende) Datenstruktur verwendet, und da ich bereits einen Index mit nitems(...)+1 erzeuge ... ja, es könnte die bessere Wahl sein.
Keine direkte Lösung, sondern eher als Workaround. Ich neige dazu, assoziative Arrays zu verwenden, ähnlich wie bei what @pmroz in Deinem Link vorgeschlagen.
FWIW Ich mache es in Ihrem zweiten Beispiel immer auf die EvalList()-Art. Ich denke, Sie könnten es auf diese Weise tun und erst bewerten, wenn Sie es wollen/müssen ... Ich bin mir nicht sicher, ob Sie dadurch viel kaufen (?)
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
