Comment convertir une liste numérique en une liste de caractères?Salut tout le monde,
J'ai une liste contenant des nombres et j'aimerais les transformer en caractères. Existe-t-il un moyen de faire cela sans utiliser de boucle? Je n'ai pas pu trouver la fonction appropriée.
Merci pour ton aide!
ScriptingRe: Comment convertir une liste numérique en un caractère?Voici un petit script qui crée une fonction qui fait ce que vous voulez.Vous pouvez soit définir et utiliser la fonction dans votre code, soit utiliser les 4 instructions en code ouvert pour effectuer la conversion.
Names Default To Here( 1 );
theList = {7,8,9};
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
theList = NumListToChar( theList );Re: Comment convertir une liste numérique en un caractère?Merci pour votre réponse @txnelson c'est bien ce que je cherchais.
Je me demande simplement quel est le plus rapide entre une boucle et une fonction qui implique la création de table. Une idée?
Re: Comment convertir une liste numérique en un caractère?Nouveau dans JMP 16 est le Pour chaque fonction () qui itère sur un conteneur - liste, matrice ou tableau associatif - pour effectuer une opération sur chaque élément.
Voici un exemple pour montrer comment l'utiliser pour convertir votre liste de nombres en une liste de chaînes de caractères.
Names Default To Here( 1 );
theList = {7, 8, 9};
For Each( {value, index}, theList, theList[index] = Char( value ) );
Re: Comment convertir une liste numérique en un caractère?Merci @Jeff_Perkinson !
J'ai fait quelques simulations juste par curiosité pour comparer le temps d'exécution de chaque solution et il semble que le pour chaque fonction est en moyenne le plus rapide!
Donc je vais choisir celui-là bien que la fonction de @txnelson fonctionne également très bien.
Merci à vous deux:)
Re: Comment convertir une liste numérique en un caractère?Voici un programme de chronométrage rapide pour les trois méthodes, pour la boucle, pour chacune, et la fonction personnalisée à l'aide de la table de données.
Names Default To Here( 1 );
listsize=1000000;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
start = HP Time();
For Each( {value, index}, theList, theList[index] = Char( value ) );
foreachloop = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
theList = NumListToChar( theList );
customfunction = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For( i = 1, i <= N Items( theList ), i++,
theList[i] = Char( theList[i] )
);
forloop = HP Time() - start;
show(foreachloop, customfunction, forloop);
Pour moi, avec la taille de liste indiquée ci-dessus, les résultats sont très similaires entre les trois méthodes:
foreachloop = 1106974;
customfunction = 1077862;
forloop = 1400643;
Re: Comment convertir une liste numérique en un caractère?Prolonger la réponse de Jeff
Différents frais généraux font mal pour les petites tailles et aident pour les grandes tailles.
dt = New Table( "Untitled 3",
Add Rows( 0 ),
New Column( "size", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "for", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "foreach", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) ),
New Column( "custom", Numeric, "Continuous", Format( "Best", 12 ), Set Values( [] ) )
);
NumListToChar = Function( {myList},
{defaultlocal},
dtx = New Table( "x", New Column( "y", values( myList ) ), private );
dtx:y << data type( character );
myList = dtx:y << get values;
Close( dtx, nosave );
Return( myList );
);
For( listsize = 1, listsize < 1e7, listsize *= 2,
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For Each( {value, index}, theList, theList[index] = Char( value ) );
foreachloop = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
theList = NumListToChar( theList );
customfunction = HP Time() - start;
theList = As List( J( listsize, 1, Random Integer( 100 ) ) );
start = HP Time();
For( i = 1, i <= N Items( theList ), i++,
theList[i] = Char( theList[i] )
);
forloop = HP Time() - start;
Show( foreachloop, customfunction, forloop );
dt << addrows( 1 );
dt:size[N Rows( dt )] = listsize;
dt:for[N Rows( dt )] = forloop / 1e6;
dt:foreach[N Rows( dt )] = foreachloop / 1e6;
dt:custom[N Rows( dt )] = customfunction / 1e6;
Wait( 0.1 ); // so it shows on display
);Re: Comment convertir une liste numérique en un caractère?Merci pour l'information supplémentaire @Jeff_Perkinson et @Craige_Hales !
Nous apprenons toujours beaucoup de choses avec la communauté !!
Re: Comment convertir une liste numérique en un caractère?Belle illustration des performances des différentes fonctions en fonction de la taille. J'utilise toujours JMP 15 et je ne peux pas utiliser Pour chaque() encore, mais pour prolonger l'exercice de chronométrage de Jeff, je lance deux autres fonctions qui donnent le même résultat.
Repeat(k = 0; {k++; Char( theList[k] )}, listsize);
Words( Substr( Char( theList ), 2, Length( Char( thelist ) ) - 2 ), ", " );

La boucle For, qui est la plus rapide pour les petites listes, est dépassée par les mots à la taille> 50, par la fonction data-table-detour à la taille> 1000 et par la répétition à la taille> 30000.
J'ai été un peu surpris de voir que Words restait le plus rapide pour une taille> 50, environ deux fois plus vite avec des millions de "mots".
Re: Comment convertir une liste numérique en un caractère?Wow, je cherchais une solution et j'en ai eu tellement! JMP est incroyable! Merci à vous tous!
Re: Comment convertir une liste numérique en un caractère?@DonMcCormack - Défier !
Re: Comment convertir une liste numérique en un caractère?Merci @Craige_Hales ! Je l'aime bien. Voyons si je peux l'intégrer au prochain défi. Devrions-nous essayer d'éviter toute itération ou simplement Pour (et ses dérivés)?Une façon d'éviter l'itération consiste à évaluer les expressions. Si vous n'êtes pas familier avec cette approche, consultez @Joseph Morgan de Tutoriel découverte, point 1 . Pour le problème ci-dessus, la fonction peut ressembler à ceci:
convertNumberToCharacter = Function({inList},{i=1,outList={}},
outList[1::N Items(inList)] = Expr(Char(inList[i++]));
Eval List(outList);
);
/* You can check it out using the code below.
tStart = HP Time();
alist = As List(J(10000,1,Random Normal(1e6,1e5)));
newList = convertNumberToCharacter(alist);
Print((HP Time()-tStart)/1e6);
*/
J'ai essayé cela dans quelques-uns des défis et, bien que succinct, a tendance à prendre plus de temps et est plus difficile à comprendre (à moins que vous ne soyez assez familier avec la gestion des expressions).
Re: Comment convertir une liste numérique en un caractère?Il y a aussi Transform Each, qui semble être un peu plus rapide que For Each ici.
theList = Transform Each( {value}, theList, Char( value ) );
Re: Comment convertir une liste numérique en un caractère?@DonMcCormack La boucle for vanilla est à la fois la plus rapide et la plus lente, selon la taille du problème. je suis vraiment surpris @Mme la solution à base de mots fonctionne si bien dans les grandes tailles. J'aime vraiment les réponses inattendues qui présentent une fonctionnalité de JMP comme celle-là. Je suis un peu surpris car chacun est plus rapide que pour, à une certaine taille. J'aime le savoir aussi.
Je n'essaierais pas d'éviter quoi que ce soit. J'aime votre plan de discussion actuel, plutôt qu'un gagnant clair. Voici quelques idées de démarrage de discussion:
- Si vous aviez N listes à convertir, et qu'elles avaient toutes M éléments, comment N et M affectent-ils le code que vous écririez? Tenez compte non seulement de la vitesse, mais aussi de l'exactitude et de la facilité d'entretien.
- Quelles sont les meilleures idées pour les machines à mémoire limitée?
- Comment afficheriez-vous "NaN" plutôt que "."?
- À quoi ressemblerait une routine à usage général? Comment l'appelleriez-vous s'il était intégré à JMP?