Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Hallo zusammen,
Ich habe eine Liste mit Zahlen und möchte diese in Zeichen umwandeln. Gibt es eine Möglichkeit, dies zu tun, ohne eine Schleife zu verwenden? Ich konnte die richtige Funktion nicht finden.
Vielen Dank für Ihre Hilfe!
Datenmischung und -bereinigungBetreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?@DonMcCormack Die Vanilla-For-Schleife ist je nach Problemgröße sowohl am schnellsten als auch am langsamsten. Ich bin Wirklich überrascht @MS Die wortbasierte Lösung funktioniert bei großen Größen sehr gut. Ich mag die unerwarteten Antworten, die eine solche Funktion in JMP hervorheben, sehr. Ich bin etwas überrascht, denn bei einer bestimmten Größe ist jeder schneller als bei. Das weiß ich auch gern.
Ich würde nicht versuchen, irgendetwas zu vermeiden. Mir gefällt Ihr aktueller Diskussionsplan eher als ein klarer Gewinner. Hier sind einige Anregungen für Diskussionen:
- Wenn Sie N Listen konvertieren müssten und alle M Elemente hätten, wie wirken sich N und M auf den Code aus, den Sie schreiben würden? Berücksichtigen Sie nicht nur die Geschwindigkeit, sondern auch die Korrektheit und Wartungsfreundlichkeit.
- Welche Ideen scheinen für Maschinen mit eingeschränktem Speicher am besten zu sein?
- Wie würden Sie „NaN“ anstelle von „.“ anzeigen?
- Wie würde eine allgemeine Routine aussehen? Wie würden Sie es nennen, wenn es in JMP integriert wäre?
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Es gibt auch Transform Each, das hier etwas schneller zu sein scheint als For Each.
theList = Transform Each( {value}, theList, Char( value ) );
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Danke @Craige_Hales ! Ich mag das. Mal sehen, ob ich es in die nächste Challenge einbauen kann. Sollten wir versuchen, jede Iteration zu vermeiden oder einfach Für (und seine Derivate)?Eine Möglichkeit, Iterationen zu vermeiden, ist die Ausdrucksauswertung. Wenn Sie mit diesem Ansatz nicht vertraut sind, schauen Sie sich das an @Joseph Morgan 'S Discovery-Tutorial, Punkt 1 . Für das obige Problem könnte die Funktion etwa so aussehen:
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);
*/
Ich habe dies in einigen Herausforderungen versucht und obwohl es prägnant ist, dauert es tendenziell länger und ist schwerer zu verstehen (es sei denn, Sie sind mit der Handhabung von Ausdrücken einigermaßen vertraut).
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?@DonMcCormack - Herausforderung !
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Wow, ich habe nach einer Lösung gesucht und so viele gefunden! JMP ist unglaublich! Danke an alle!
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Schöne Veranschaulichung der größenabhängigen Leistung der verschiedenen Funktionen. Ich verwende immer noch JMP 15 und kann es nicht verwenden Für jede() Doch um Jeffs Timing-Übung weiter auszudehnen, füge ich zwei weitere Funktionen hinzu, die das gleiche Ergebnis liefern.
Repeat(k = 0; {k++; Char( theList[k] )}, listsize);
Words( Substr( Char( theList ), 2, Length( Char( thelist ) ) - 2 ), ", " );

Die For-Schleife, die für kleine Listen am schnellsten ist, wird von Words bei einer Größe > 50, von der Funktion data-table-detour bei einer Größe > 1000 und von Repeat bei einer Größe > 30000 übertroffen.
Ich war ein wenig überrascht, als ich sah, dass Wörter bei Größe > 50 am schnellsten blieben, bei Millionen von „Wörtern“ etwa doppelt so schnell.
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Vielen Dank für die zusätzlichen Informationen @Jeff_Perkinson Und @Craige_Hales !
Wir lernen immer viel mit der Community!!
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Ich erweitere Jeffs Antwort
Different overheads hurt for small sizes and help for large sizes.Different overheads hurt for small sizes and help for large sizes.Unterschiedliche Gemeinkosten schaden bei kleinen Größen und helfen bei großen Größen.
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
);Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Hier ist ein schnelles Timing-Programm für die drei Methoden, for-Schleife, for every und benutzerdefinierte Funktionen mithilfe einer Datentabelle.
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);
Für mich mit der oben gezeigten Listengröße sind die Ergebnisse zwischen den drei Methoden sehr ähnlich:
foreachloop = 1106974;
customfunction = 1077862;
forloop = 1400643;
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Danke @Jeff_Perkinson !
Ich habe aus reiner Neugier einige Simulationen durchgeführt, um die Ausführungszeit jeder Lösung zu vergleichen, und es scheint, dass die für jede Funktion im Durchschnitt die schnellste ist!
Deshalb werde ich dieses auswählen, obwohl die Funktion von @txnelson funktioniert auch sehr gut.
Danke euch beiden 
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Neu in JMP 16 ist das Für die Funktion Each() die über einen Container – Liste, Matrix oder assoziatives Array – iteriert, um eine Operation für jedes Element auszuführen.
Hier ist ein Beispiel, das zeigt, wie Sie damit Ihre Zahlenliste in eine Liste mit Zeichenfolgen konvertieren.
Names Default To Here( 1 );
theList = {7, 8, 9};
For Each( {value, index}, theList, theList[index] = Char( value ) );
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Danke für deine Antwort @txnelson Es ist tatsächlich das, wonach ich gesucht habe.
Ich frage mich nur, was schneller zwischen einer Schleife und einer Funktion ist, die die Tabellenerstellung beinhaltet. Irgendeine Idee?
Betreff: Wie konvertiere ich eine numerische Liste in eine Zeichenliste?Hier ist ein kleines Skript, das eine Funktion erstellt, die das tut, was Sie wollen.Sie können die Funktion entweder in Ihrem Code definieren und verwenden oder die 4 Anweisungen im offenen Code verwenden, um die Konvertierung durchzuführen.
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 );