Comment convertir une liste numérique en une liste de caractères ?Salut tout le monde,
J'ai une liste contenant des nombres et je voudrais les transformer en caractères. Existe-t-il un moyen de le faire sans utiliser de boucle? Je n'ai pas trouvé la bonne fonction.
Merci pour votre aide!
Fusion et nettoyage des donnéesRe : Comment convertir une liste numérique en une liste de caractères ?@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 @SP la solution basée sur les mots fonctionne si bien dans les grandes tailles. J'aime beaucoup les réponses inattendues qui présentent une fonctionnalité de JMP comme celle-là. Je suis un peu surpris que for-each soit plus rapide que for, à une certaine taille. J'aime bien le savoir aussi.
Je n'essaierais pas d'éviter quoi que ce soit. J'aime votre plan actuel pour une discussion, 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 ? Considérez non seulement la vitesse, mais l'exactitude et la facilité d'entretien.
- Quelles idées semblent les meilleures 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 ?
Re : Comment convertir une liste numérique en une liste de caractères ?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 une liste de caractères ?Merci @Craige_Hales ! Je l'aime bien. Laissez-moi voir si je peux l'intégrer au prochain défi. Faut-il essayer d'éviter toute itération ou juste Pour (et ses dérivés) ?Une façon d'éviter l'itération consiste à évaluer l'expression. Si vous n'êtes pas familier avec cette approche, consultez @Joseph Morgan c'est Tutoriel découverte, point 1 . Pour le problème ci-dessus, la fonction pourrait 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, cela 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 une liste de caractères ?@DonMcCormack - Défi !
Re : Comment convertir une liste numérique en une liste de caractères ?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 une liste de caractères ?Belle illustration de la performance dépendante de la taille des différentes fonctions. J'utilise toujours JMP 15 et je ne peux pas utiliser Pour chaque() encore, mais pour étendre davantage l'exercice de chronométrage de Jeff, j'ajoute 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 Words à size>50, par la fonction data-table-detour à size>1000 et par Repeat à size>30000.
J'ai été un peu surpris de voir que Words restait le plus rapide pour la taille>50, environ deux fois plus rapide à des millions de "mots".
Re : Comment convertir une liste numérique en une liste de caractères ?Merci pour l'information supplémentaire @Jeff_Perkinson et @Craige_Hales !
On apprend toujours plein de choses avec la Communauté !!
Re : Comment convertir une liste numérique en une liste de caractères ?Extension de la réponse de Jeff
Different overheads hurt for small sizes and help for large sizes.Different overheads hurt for small sizes and help for large sizes.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 une liste de caractères ?Voici un programme de chronométrage rapide pour les trois méthodes, boucle for, for each et fonction personnalisée utilisant une 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 une liste de caractères ?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 la fonction for each soit en moyenne la plus rapide !
Je vais donc choisir celui-là bien que la fonction de @txnelson fonctionne aussi très bien.
Merci à vous deux 
Re : Comment convertir une liste numérique en une liste de caractères ?La nouveauté de JMP 16 est la 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 une liste de caractères ?Merci pour votre réponse @txnelson c'est effectivement ce que je cherchais.
Je me demande juste ce qui 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 une liste de caractères ?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 );