Liste von Listen ohne for-Schleife transponierenIch hätte gerne eine Methode zum Transponieren einer Liste von Listen, ohne eine for-Schleife zu verwenden. Das heißt, eine Funktion (nennen Sie sie zum Beispiel „Listtranspose“), die die „Zeilen“ und „Spalten“ einer Liste von Listen umdreht, wie folgt:
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
tranlist = Listtranspose(listlist);
Show(tranlist);
/*Result:
{{"cat", "meow"}, {"dog", "bark"}, {"mouse", "squeak}}
Eine alternative Implementierung könnte etwa so aussehen:
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
nr = NItems(listlist);
col1 = listlist[1::nr][1];
col2 = listlist[1::nr][2];
col3 = listlist[1::nr][3];
translist = EvalList({col1, col2, col3});
Die letztere Implementierung gefällt mir irgendwie besser, da ich möglicherweise nur eine Teilmenge von „Spalten“ transponieren muss, nicht die gesamte Liste.
Dies kann natürlich auch mit einer For-Schleife erfolgen, aber der Grund dafür ist, dass For-Schleifen langsam sein können. Ich arbeite mit großen Textblöcken und glaube, dass dies die Arbeit für mich erheblich beschleunigen würde.
Gutschrift an @vince_faller dass ich das ursprünglich gefragt habe.Liste von Listen ohne for-Schleife transponieren
Automatisierung und SkripterstellungBetreff: Liste von Listen ohne for-Schleife transponierenIch denke noch etwas darüber nach.Ich kann die for-Schleife immer noch nicht überwinden, aber ich dachte, ich schreibe das auf, falls es jemandem hilft.
// make a blank data table with the right shape
dt = As Table(J(nr, nc, .), <<PRIVATE></PRIVATE>
Betreff: Liste von Listen ohne for-Schleife transponieren@Craige_Hales Vielen Dank für den großartigen Einblick, Craig. Ich stimme zu, ich habe einen Geschwindigkeitstest der for-Schleife im Vergleich zur Parallel-Assign-Methode durchgeführt und die Parallel-Assign-Methode war viel langsamer. Mein Listenarray war 718r x 14182c, also >10 Millionen Elemente. Ich habe das Skript etwa 10 Minuten lang ausgeführt, aber der Vorgang wurde nicht abgeschlossen. Dies scheint etwas langsamer zu sein, als Ihre obigen Daten vorhersagen, aber es sind zu viele Variablen zu berücksichtigen (z. B. Computersystem, Verhältnis von Spalten zu Zeilen?). Die For-Schleife ist mit ~10,1 Sekunden für dieselbe Tabelle viel schneller.
Allerdings immer noch langsamer als mir lieb ist. Es wäre toll, eine JMP-Funktion zu haben, die dies intern erledigen kann.
Betreff: Liste von Listen ohne for-Schleife transponierenAber nach einigen Tests denke ich, dass eine einfache verschachtelte Schleife schneller sein wird als jeder andere JSL-basierte Ansatz.
result = {};
for( c = 1, c <= nc, c += 1,
thisrow = {}; // build a row from a column
for( r = 1, r <= nr, r += 1,
thisrow[r] = testList[r][c];
);
result[c] = thisrow;
);@DonMcCormack - Herausforderung!
The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.Die For-Schleife mit der blauen Linie ist durchweg besser. Die violette JSON-Tabelle könnte es überholen, aber mir geht der Speicher aus. Der Trick der parallelen Zuweisung beginnt bei großen Zahlen zu scheitern.
Die parallele Zuweisung blockiert wahrscheinlich ständig Threads gegeneinander. Aufgrund des unterschiedlichen Overheads zwischen den beiden übertrifft sie zunächst die JSON-Datentabelle.
Betreff: Liste von Listen ohne for-Schleife transponierenJa, es wäre schön, mehr Funktionen zur Listenmanipulation zu haben. Mir fällt kein schöner oder schneller Weg ein, aber nach ein bisschen Spielen ist mir dieser eingefallen. Es benötigt JMP 15, schlägt in 14 fehl.
list = {{"lion", "tiger", "puma"}, {"lamp", "torch", "pharos"}, {"lark", "toucan", "pigeon"}, {"lawn", "terrace", "patio"}};
jlist = As JSON Expr( list );
dt1 = JSON To Data Table( jlist, invisible(1) );
dt1 << New Column( "row", numeric, setvalues( 1 + Floor( (0 :: (N Rows( dt1 ) - 1)) / N Items( list[1] ) ) ) );
dt2 = dt1 << Split( Split By( :row ), Split( column(dt1,1) ), Sort by Column Property, invisible(1) );
Close( dt1, nosave );
transposed = dt2[0, 0];
Close( dt2, nosave );
Show( list, transposed );list = {{"Löwe", "Tiger", "Puma"}, {"Lampe", "Fackel", "Pharos"}, {"Lerche", "Tukan", "Taube"}, {"Rasen", „Terrasse“, „Patio“}};
transponiert = {{"Löwe", "Lampe", "Lerche", "Rasen"}, {"Tiger", "Fackel", "Tukan", "Terrasse"}, {"Puma", " Pharos ", "Taube", "Terrasse"}};
Blenden Sie die Zwischentabellen ein, um zu sehen, was es tut. Eine echte Lösung sollte sich mit Zeilen ungleicher Länge befassen.
Betreff: Liste von Listen ohne for-Schleife transponieren@Craige_Hales hat eine tolle Erklärung geschrieben, die ich regelmäßig verwende.Fehlerbehebung bei Multithreading mithilfe von Parallel Assign
Betreff: Liste von Listen ohne for-Schleife transponieren@vince_faller
Verstand == Geblasen.
Ich habe noch nie von der Parallel Assign-Funktion gehört. Ich habe es versucht und ja, es funktioniert. Obwohl ich mit Zeichenfolgen arbeite und dies technisch gesehen eine Matrixfunktion ist, ist es ihr irgendwie egal. Es wird interessant sein, damit herumzuspielen und zu sehen, ob es schneller ist als eine for-Schleife. Ich werde versuchen, es hier zu aktualisieren, sobald ich es weiß.
Danke für die Idee!
Betreff: Liste von Listen ohne for-Schleife transponierenIch schwöre, ich habe gesehen, wie jemand etwas in der Art getan hat
{"cat", "dog", "mouse", "meow", "bark", "squeak"}[[1 1, 1 1]]
// and had it return
{{"cat", "cat"}, {"cat", "cat"}}
während eines Gesprächs bei der Entdeckung, aber ich konnte es nie nachbilden.Es könnte alles ein Traum gewesen sein?
Wenn ich mich recht erinnere, haben sie irgendwie aus einer flachen Liste in einer Zeile so eine neue Liste geformt.Ich erinnere mich wahrscheinlich nicht mehr richtig.
Davon abgesehen können Sie die parallele Zuweisung wahrscheinlich sehr schnell durchführen
names default to here(1);
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
m = J(nc, nr, -1);
::trans_list = Aslist(m);
Parallel Assign({l = listlist},
m[a, b] = (
::trans_list[a][b] = l[b][a];
)
);
show(::trans_list);Betreff: Liste von Listen ohne For-Schleife transponieren2024 - JMP18
Was ist der beste/schnellste Weg, eine Liste von Listen zu transponieren?
Betreff: Transponieren einer Liste von Listen ohne for-Schleife@hogi Könntest du die obigen Skripte ausführen und uns Bescheid geben?
(faul/egoistisch)
Betreff: Transponieren einer Liste von Listen ohne for-SchleifeTut mir leid, ich meinte, dass ich faul und egoistisch bin. Ich hatte ein Engel-Emoji, aber es wurde nicht übertragen. Es tut mir sehr leid.
Betreff: Transponieren einer Liste von Listen ohne for-SchleifeFühre die Skripte aus: Dieser Ansatz funktioniert nur dann, wenn der einfachste/schnellste/beste Ansatz für 2024 bereits in der Liste der Möglichkeiten von 2021 enthalten ist ; )
Gibt es vielleicht jetzt eine ultraschnelle, supereinfache Funktion listtranspose(Liste von Listen), die erst durch die Verbesserungen von JMP17 oder JMP18 möglich wurde?
Betreff: Transponieren einer Liste von Listen ohne for-SchleifeDa seit 2021 nur eine einzige Stimme abgegeben wurde, halte ich die Chancen für gering.
Listtranspose(listlist);
Falls Ihnen dieser Wunsch aufgefallen ist, werfen Sie bitte auch einen Blick auf Einfügen in: Flatten(0|1) und stimmen Sie dafür ab 
Betreff: Transponieren einer Liste von Listen ohne for-SchleifeParallel Assign (als zweidimensionale For-Schleife) hat gegen die eindimensionale For-Schleife keine Chance.
(… oder @vince_fallers Ansatz über Datentabellenmanipulationen)
Gewinner in meinem System: DataTable!

Betreff: Transponieren einer Liste von Listen ohne for-Schleife
Der Nachteil, wenn es in der Community keine Emojis gibt ; )