Concat plusieurs éléments de liste ensembleUtilisation de JMP12.2 - Je recherche un moyen rapide de concaténer des éléments de liste à partir de deux listes différentes de manière 1 à 1 - en supposant que les listes contiennent le même nombre d'éléments. Cela sera utilisé pour chaque ligne dans de très grandes tables - je préfère donc aucune fonction itérative si possible.
Voici un exemple de ce que je veux réaliser :
list1 = {"a","b","c","d","e","f","g"} ;
liste2 = {"1","2","3","4","5","6","7"} ;
Le résultat acceptable peut être une chaîne ou une liste. Si chaîne séparée par des délimiteurs.
Résultat de la liste : {"a,1","b,2","c,3","d,4","e,5","f,6","g,7"} ;
Résultat de chaîne : "a:1,b:2,c:3,d:4,e:5,f:6,g:7" ;
ScriptRe: Concater plusieurs éléments de liste ensemblesalut @ts2 ,
Selon ce que vous voulez faire avec les résultats, vous pouvez l'aborder de différentes manières. Je sais que vous ne voulez pas faire de fonctions itératives, mais pour obtenir la bonne sortie où les éléments d'une liste sont connectés aux éléments d'une autre liste, je pense que vous devez faire une boucle For. Vous pouvez également envisager de créer un tableau associatif.
Vous trouverez ci-dessous quelques JSL qui pourraient vous aider à démarrer une solution.
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);J'espère que cela t'aides!,
DS
Re: Concater plusieurs éléments de liste ensembleLes boucles JSL ont une réputation injustement mauvaise. Si les entrailles de la boucle font beaucoup de travail, la surcharge de la boucle n'aura généralement pas beaucoup d'importance. Et toute solution sans boucle JSL va impliquer une boucle ailleurs, peut-être en C++ qui sera un peu plus rapide, mais quand même. Quoi qu'il en soit, voici une comparaison de deux méthodes, l'une impliquant une boucle JSL et l'autre utilisant une boucle cachée dans le code C++ de JMP.
Graphique montrant les temps de croisement des deux algorithmes à environ 39 000 éléments.
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 est le plus ancien auquel j'ai accès. Je pense que l'algorithme de boucle aura des performances similaires dans JMP 12. Il détruit intentionnellement les deux listes au fur et à mesure qu'il les traite car les anciennes versions de JMP n'avaient pas d'indexation rapide dans les listes, mais la suppression du premier élément est rapide. L'algorithme de table de données est le premier dans la boucle afin qu'il puisse utiliser les listes avant qu'elles ne soient détruites.
En regardant le JSL, je ne devrais pas prétendre que l'un ou l'autre des algorithmes est plus simple ou plus facile à suivre.
Re: Concater plusieurs éléments de liste ensembleOui, j'ai peut-être supposé que l'itération (pour) au sein de l'itération (pour chaque ligne) aurait un impact sévère sur les performances du script, mais après la construction de l'exemple @DiedrichSchmidt suggéré que la performance est étonnamment bonne.
Merci pour la comparaison - j'aurais supposé que le c++ serait toujours plus rapide, mais il est logique qu'une table ait toujours plus de frais généraux. Je me demande si la table « Commencer la mise à jour des données » et/ou « Privée » améliorerait la surcharge de la table ?
Re: Concater plusieurs éléments de liste ensembleMerci cela fonctionne très bien. Même s'il utilise une fonction itérative, il a de bonnes performances.
Re : concaténer plusieurs éléments de liste ensembleMon problème est résolu - il s'agit plutôt d'un FYI pour vous et d'autres qui pourraient le trouver utile.
J'ai accès à JMP14.3 mais le script doit s'exécuter sur JMP12.2 pour assurer la compatibilité au sein de mon organisation.
J'ai essayé votre analyse et pour JMP14.3, j'ai obtenu des résultats similaires aux vôtres - probablement des différences de puissance de calcul.

Cependant, JMP12.2 la performance de la boucle va complètement hors de la ligne. Je dois tuer le processus JMP.exe après 98304 car le temps augmentait de façon exponentielle et n'aurait jamais atteint la 24e ligne :
