如何將數字列表轉換為字符列表?大家好你們好,
我有一個包含數字的列表,我想將它們轉換為字符。 有沒有一種方法可以不使用循環? 我找不到合適的功能。
謝謝你的幫助!
腳本編寫回复:如何將數字列表轉換為字符列表?這是一個小腳本,用於創建可以執行所需功能的函數。您可以在代碼中定義和使用該函數,也可以在開放代碼中使用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 );回复:如何將數字列表轉換為字符列表?感謝您的回答@txnelson確實是我要找的東西。
我只是想知道在循環和涉及表創建的函數之間最快的方法是什麼。 任何想法?
回复:如何將數字列表轉換為字符列表?JMP 16中的新功能是對於Each()函數它遍歷容器(列表,矩陣或關聯數組)以對每個元素執行操作。
這是一個示例,說明如何使用它將數字列表轉換為字符串列表。
Names Default To Here( 1 );
theList = {7, 8, 9};
For Each( {value, index}, theList, theList[index] = Char( value ) );
回复:如何將數字列表轉換為字符列表?謝謝@傑夫·珀金森!
我只是出於好奇而進行了一些模擬,以比較每個解決方案的執行時間,而且似乎每個函數平均來說是最快的!
因此,儘管@txnelson也很好用。
感謝你們倆:)
回复:如何將數字列表轉換為字符列表?這是針對這三種方法的快速計時程序,分別用於循環,每種方法以及使用數據表的自定義功能。
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);
對於我來說,如上所示的listsize,三種方法的結果非常相似:
foreachloop = 1106974;
customfunction = 1077862;
forloop = 1400643;
回复:如何將數字列表轉換為字符列表?擴展傑夫的答案
不同的間接費用對小尺寸產品不利,對大尺寸產品有幫助。
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
);回复:如何將數字列表轉換為字符列表?感謝您的附加信息@傑夫·珀金森和@Craige_Hales !
我們總是在社區中學到很多東西!!
回复:如何將數字列表轉換為字符列表?很好地說明了不同功能的大小相關性能。 我仍在使用JMP 15,無法使用對於每個()但是,為了進一步擴展Jeff的計時練習,我將介紹另外兩個具有相同結果的函數。
Repeat(k = 0; {k++; Char( theList[k] )}, listsize);
Words( Substr( Char( theList ), 2, Length( Char( thelist ) ) - 2 ), ", " );

For循環(對於小型列表而言最快)超過了Words的大小> 50,超過了data-table-tourtour函數的大小> 1000,而Repeat超過了大小30000。
令我驚訝的是,當字數大於50時,單詞仍然保持最快的速度,大約是數百萬個“單詞”的兩倍。
回复:如何將數字列表轉換為字符列表?哇,我在尋找一種解決方案,我有很多! JMP太神奇了! 謝謝大家!
回复:如何將數字列表轉換為字符列表?@DonMcCormack --挑戰!
回复:如何將數字列表轉換為字符列表?謝謝@Craige_Hales ! 我喜歡。 讓我看看是否可以將其應用於下一個挑戰。 我們應該嘗試避免任何迭代還是只是避免為了(及其衍生產品)?避免迭代的一種方法是通過表達式求值。 如果您不熟悉這種方法,請查看@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);
*/
我已經在一些“挑戰”中對此進行了嘗試,雖然簡潔,但往往會花費更長的時間,而且更難理解(除非您對錶達式處理相當熟悉)。
回复:如何將數字列表轉換為字符列表?還有“轉換每個”,似乎比這裡的“ For Each”快一點。
theList = Transform Each( {value}, theList, Char( value ) );
回复:如何將數字列表轉換為字符列表?@DonMcCormack取決於問題的大小,香草for-loop最快和最慢。 我是真的驚訝的@小姐基於單詞的解決方案在大尺寸情況下表現出色。 我真的很喜歡意想不到的答案,這些答案展示了這樣的JMP功能。 我感到有些驚訝,因為在某種規模下,每種方法都比其他方法要快。 我也喜歡知道這一點。
我不會嘗試避免任何事情。 我喜歡您當前的討論計劃,而不是明確的獲勝者。 以下是一些討論入門思路:
- 如果您有N個要轉換的列表,並且它們都有M個元素,那麼N和M如何影響您將編寫的代碼? 不僅要考慮速度,還要考慮正確性和易於維護性。
- 哪種想法最適合內存受限的機器?
- 您將如何顯示“ NaN”而不是“。”?
- 通用例程是什麼樣的? 如果它內置在JMP中,您會怎麼稱呼它?