数値リストを文字リストに変換するにはどうすればよいですか?みなさん、こんにちは。
数字を含むリストがあり、それらを文字に変換したいと思います。 ループを使用せずにそれを行う方法はありますか? 適切な機能を見つけることができませんでした。
ご協力いただきありがとうございます!
スクリプティングRe:数値リストを文字リストに変換するにはどうすればよいですか?これは、必要なことを実行する関数を作成する小さなスクリプトです。コードで関数を定義して使用するか、オープンコードで4つのステートメントを使用して変換を行うことができます。
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:数値リストを文字リストに変換するにはどうすればよいですか?ご回答有難うございます@txnelsonそれは確かに私が探していたものです。
ループとテーブルの作成を伴う関数の間で何が速いのか疑問に思います。 何か案が?
Re:数値リストを文字リストに変換するにはどうすればよいですか?JMP16の新機能はEach()関数の場合これは、コンテナ(リスト、行列、または連想配列)を反復処理して、各要素に対して操作を実行します。
これを使用して、数値のリストを文字列のリストに変換する方法を示す例を次に示します。
Names Default To Here( 1 );
theList = {7, 8, 9};
For Each( {value, index}, theList, theList[index] = Char( value ) );
Re:数値リストを文字リストに変換するにはどうすればよいですか?ありがとう@Jeff_Perkinson !
各ソリューションの実行時間を比較するために好奇心だけでいくつかのシミュレーションを行いましたが、各関数のは平均して最速のようです!
だから私はそれを選ぶつもりですが@txnelsonまた、非常にうまく機能します。
お二人に感謝します:)
Re:数値リストを文字リストに変換するにはどうすればよいですか?これは、forループ、for、およびデータテーブルを使用したカスタム関数の3つのメソッドのクイックタイミングプログラムです。
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);
上に示したリストサイズの私にとって、結果は3つの方法の間で非常に似ています。
foreachloop = 1106974;
customfunction = 1077862;
forloop = 1400643;
Re:数値リストを文字リストに変換するにはどうすればよいですか?ジェフの答えを拡張する
オーバーヘッドが異なると、小さいサイズでは問題が発生し、大きいサイズでは役立ちます。
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:数値リストを文字リストに変換するにはどうすればよいですか?追加情報をありがとう@Jeff_Perkinsonそして@Craige_Hales !
私たちはいつもコミュニティでたくさんのことを学びます!
Re:数値リストを文字リストに変換するにはどうすればよいですか?さまざまな機能のサイズに依存するパフォーマンスの優れた図。 まだJMP15を使用していて、使用できません各()についてそれでも、ジェフのタイミング演習をさらに拡張するために、同じ結果をもたらす2つの関数を追加します。
Repeat(k = 0; {k++; Char( theList[k] )}, listsize);
Words( Substr( Char( theList ), 2, Length( Char( thelist ) ) - 2 ), ", " );

小さなリストで最速のForループは、サイズ> 50のWords、サイズ> 1000のdata-table-detour関数、およびサイズ> 30000のRepeatによって上回っています。
Wordsが50を超えるサイズで最速であり、数百万の「words」で約2倍の速さであることに少し驚きました。
Re:数値リストを文字リストに変換するにはどうすればよいですか?うわー、私は1つの解決策を探していました、そして私はとても多くを得ました! JMPはすごい! 皆さんに感謝します!
Re:数値リストを文字リストに変換するにはどうすればよいですか?@DonMcCormack -チャレンジ!
Re:数値リストを文字リストに変換するにはどうすればよいですか?ありがとう@Craige_Hales ! 私はそれが好きです。 次のチャレンジに取り組むことができるかどうか見てみましょう。 反復を回避しようとするべきか、それとも単ににとって(およびその派生物)?反復を回避する1つの方法は、式の評価を使用することです。 このアプローチに慣れていない場合は、チェックアウトしてください@joseph_morganの発見チュートリアル、ポイント1 。 上記の問題の場合、関数は次のようになります。
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);
*/
私はいくつかの課題でこれを試しましたが、簡潔ではありますが、時間がかかり、理解するのが難しい傾向があります(式の処理にかなり精通している場合を除く)。
Re:数値リストを文字リストに変換するにはどうすればよいですか?Transform Eachもあります。これは、ForEachよりも少し速いようです。
theList = Transform Each( {value}, theList, Char( value ) );
Re:数値リストを文字リストに変換するにはどうすればよいですか?@DonMcCormackバニラのforループは、問題のサイズに応じて、最速と最遅の両方になります。 私は本当にびっくり@MS単語ベースのソリューションは、大きなサイズで非常にうまく機能します。 そのようなJMPの機能を紹介する予想外の答えが本当に好きです。 私は少し驚いています-それぞれが、あるサイズでは、よりも高速です。 私もそれを知っているのが好きです。
私は何も避けようとはしません。 明確な勝者ではなく、現在の議論の計画が好きです。 ここにいくつかのディスカッションスターターのアイデアがあります:
- 変換するリストがN個あり、それらすべてにM個の要素がある場合、NとMは作成するコードにどのように影響しますか? 速度だけでなく、正確さとメンテナンスのしやすさも考慮してください。
- メモリに制約のあるマシンに最適と思われるアイデアはどれですか?
- 「。」ではなく「NaN」をどのように表示しますか?
- 汎用ルーチンはどのようになりますか? JMPに組み込まれているとしたら、何と呼びますか?