Verketten Sie mehrere Listenelemente zusammenVerwenden von JMP12.2 - Ich suche nach einer schnellen Möglichkeit, Listenelemente aus zwei verschiedenen Listen 1 zu 1 zu verketten - vorausgesetzt, die Listen haben die gleiche Anzahl von Elementen. Dies wird für jede Zeile in sehr großen Tabellen verwendet - daher bevorzuge ich wenn möglich keine iterative Funktion.
Hier ist ein Beispiel für das, was ich erreichen möchte:
list1 = {"a","b","c","d","e","f","g"};
list2 = {"1","2","3","4","5","6","7"};
Akzeptables Ergebnis kann eine Zeichenfolge oder eine Liste sein. Wenn durch Trennzeichen getrennte Zeichenfolge.
Listenergebnis: {"a,1","b,2","c,3","d,4","e,5","f,6","g,7"};
String-Ergebnis: "a:1,b:2,c:3,d:4,e:5,f:6,g:7";
SkriptingRe: Mehrere Listenelemente zusammenfassenHi @ts2 ,
Je nachdem, was Sie mit den Ergebnissen machen möchten, können Sie es auf verschiedene Weise angehen. Ich weiß, dass Sie keine iterativen Funktionen ausführen möchten, aber um die richtige Ausgabe zu erhalten, bei der die Elemente einer Liste mit den Elementen einer anderen Liste verbunden sind, müssen Sie meiner Meinung nach eine For-Schleife ausführen. Sie könnten auch erwägen, ein assoziatives Array zu erstellen.
Nachfolgend finden Sie einige JSL, die Ihnen bei den ersten Schritten mit einer Lösung helfen können.
names default to here(1);
list1 = {"a","b","c","d","e","f","g"};
list2 = {"1","2","3","4","5","6","7"};
AA = Associative Array(List1, List2);
i=.;
result1={};
For(i=1, i<=nitems(list1), i++,
result1[i]=list1[i]||":"||list2[i]
);
result 2 = EvalList({Concat Items(result1, ", ")});
Show(result1);
Show(result2);
Show (AA);Hoffe das hilft!,
DS
Re: Mehrere Listenelemente zusammenfassenJSL-Loops haben einen unverdient schlechten Ruf. Wenn der Mut der Schleife viel Arbeit verrichtet, spielt der Overhead der Schleife normalerweise keine große Rolle. Und jede Lösung ohne JSL-Schleife wird eine Schleife an anderer Stelle beinhalten, vielleicht in C++, die etwas schneller ist, aber immer noch. Wie auch immer, hier ist ein Vergleich zweier Methoden, eine mit einer JSL-Schleife und eine mit einer im C++-Code von JMP versteckten Schleife.
Grafik mit Übergangszeiten der beiden Algorithmen bei rund 39.000 Elementen.
dtGraph = New Table( "stats",
Add Rows( 0 ),
New Column( "size", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "table time", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "loop time", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) )
);
For( n = 1, n < 1e7, n *= 2,
dtGraph << addrows( 1 );
dtGraph:size[N Rows( dtGraph )] = n * 3;// 3 items repeated...
list1 = Repeat( {"a", "b", "c"}, n );
list2 = Repeat( {"1", "2", "3"}, n );
start = HP Time(); // data table method begins here
dt = New Table( "temp",
New Column( "a", Character, "Nominal", Set Values( list1 ) ),
New Column( "b", Character, "Nominal", Set Values( list2 ) ),
New Column( "c", Character, "Nominal", formula( a || ":" || b ) ),
invisible
);
dt << runformulas;
result = dt:c << getvalues;
Close( dt, nosave );
stop = HP Time(); // data table method ends here
Show( stop - start );
result = Concat Items( result, "," );
Show( Length( result ), Left( result, 100 ) );
dtGraph:table time[N Rows( dtGraph )] = (stop - start) / 1e6;
result = {};
start = HP Time(); // loop method begins here
While(
a = Remove From( list1, 1 );
b = Remove From( list2, 1 );
N Items( a ); // as long as something was removed...
, // do this...
Insert Into( result, a[1] || ":" || b[1] )
);
stop = HP Time(); // loop method ends here
Show( stop - start );
result = Concat Items( result, "," );
Show( Length( result ), Left( result, 100 ) );
dtGraph:loop time[N Rows( dtGraph )] = (stop - start) / 1e6;
Wait( 1 );
);
dtGraph << Graph Builder(
Size( 1200, 500 ),
Show Control Panel( 0 ),
Variables( X( :size ), Y( :table time ), Y( :loop time, Position( 1 ) ) ),
Elements( Points( X, Y( 1 ), Y( 2 ), Legend( 5 ) ), Smoother( X, Y( 1 ), Y( 2 ), Legend( 6 ) ) ),
SendToReport(
Dispatch( {}, "size", ScaleBox, {Scale( "Log" ), Inc( 1 ), Minor Ticks( 1 )} ),
Dispatch( {}, "table time", ScaleBox, {Scale( "Log" ), Format( "Best", 12 ), Inc( 1 ), Minor Ticks( 1 )} )
)
);JMP 14 ist das älteste, auf das ich Zugriff habe. Ich denke, der Schleifenalgorithmus wird in JMP 12 eine ähnliche Leistung haben. Es zerstört absichtlich die beiden Listen, während es sie verarbeitet, weil ältere JMP-Versionen keine schnelle Indizierung in Listen hatten, aber das Entfernen des ersten Elements geht schnell. Der Datentabellenalgorithmus befindet sich zuerst in der Schleife, damit er die Listen verwenden kann, bevor sie zerstört werden.
Rückblickend auf die JSL sollte ich nicht behaupten, dass einer der Algorithmen einfacher oder leichter zu befolgen ist.
Re: Mehrere Listenelemente zusammenfassenJa, ich habe vielleicht angenommen, dass die Iteration (für) innerhalb der Iteration (für jede Zeile) die Skriptleistung stark beeinträchtigen würde, aber nach dem Erstellen des Beispiels @DiedrichSchmidt vorgeschlagen, die Leistung ist überraschend gut.
Danke für den Vergleich - ich hätte angenommen, dass c++ immer schneller wäre, aber es macht Sinn, dass eine Tabelle immer mehr Overhead hat. Ich frage mich, ob die Tabellen "Begin Data Update" und/oder "Private" den Tabellen-Overhead verbessern würden.
Re: Mehrere Listenelemente zusammenfassenDanke das funktioniert super. Obwohl es eine iterative Funktion verwendet, hat es eine gute Leistung.
Re: Mehrere Listenelemente zusammenfassenMein Problem ist gelöst - dies ist eher eine Info für Sie und andere, die es nützlich finden könnten.
Ich habe Zugriff auf JMP14.3, aber das Skript muss auf JMP12.2 ausgeführt werden, um die Kompatibilität innerhalb meiner Organisation zu gewährleisten.
Ich habe Ihre Analyse ausprobiert und für JMP14.3 ähnliche Ergebnisse wie Sie erhalten - wahrscheinlich einige Unterschiede in der Rechenleistung.

Allerdings gerät bei JMP12.2 die Performance der Schleife komplett aus der Reihe. Ich muss den JMP.exe-Prozess nach 98304 beenden, da die Zeit exponentiell zunahm und nie die 24. Reihe erreicht hätte:
