如何將數字列表轉換為字符列表?大家好你們好,
我有一個包含數字的列表,我想將它們轉換為字符。 有沒有辦法在不使用循環的情況下做到這一點? 我無法找到正確的功能。
感謝您的幫助!
數據混合和清理回复:如何將數字列表轉換為字符列表?@唐麥考馬克普通的 for 循環既最快又最慢,具體取決於問題的大小。 我是真的驚訝@多發性硬化症基於單詞的解決方案在大尺寸下表現得非常好。 我真的很喜歡那些意想不到的答案,它們展示了 JMP 中的此類功能。 我有點驚訝 for-each 在某些尺寸下比 for 更快。 我也喜歡知道這一點。
我不會試圖避免任何事情。 我喜歡你目前的討論計劃,而不是明顯的獲勝者。 以下是一些討論的起始想法:
- 如果您有 N 個列表要轉換,並且它們都有 M 個元素,那麼 N 和 M 對您要編寫的代碼有何影響? 不僅要考慮速度,還要考慮正確性和易於維護。
- 哪些想法最適合內存受限的機器?
- 你會如何顯示“NaN”而不是“.”?
- 通用例程是什麼樣的? 如果它內置於 JMP 中,您會怎麼稱呼它?
回复:如何將數字列表轉換為字符列表?還有 Transform Each,它似乎比這裡的 For Each 快一點。
theList = Transform Each( {value}, theList, Char( value ) );
回复:如何將數字列表轉換為字符列表?謝謝@Craige_Hales ! 我喜歡。 讓我看看我能否將其投入到下一個挑戰中。 我們應該嘗試避免任何迭代還是只是為了(及其衍生品)?避免迭代的一種方法是通過表達式求值。 如果您不熟悉這種方法,請查看@約瑟夫_摩根的發現教程,第 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);
*/
我在一些挑戰賽中嘗試過這一點,雖然簡潔,但往往需要更長的時間並且更難理解(除非您非常熟悉表達式處理)。
回复:如何將數字列表轉換為字符列表?@唐麥考馬克-挑戰!
回复:如何將數字列表轉換為字符列表?哇,我一直在尋找一種解決方案,但我得到了很多! JMP 太棒了! 感謝大家!
回复:如何將數字列表轉換為字符列表?很好地說明了不同功能的尺寸相關性能。 我仍在使用 JMP 15,但無法使用對於每個()還沒有,但是為了進一步擴展 Jeff 的計時練習,我又添加了兩個給出相同結果的函數。
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 時仍然是最快的,在數百萬“單詞”時速度大約是其兩倍。
回复:如何將數字列表轉換為字符列表?感謝您的附加信息@傑夫·珀金森和@Craige_Hales !
我們總是在社區中學到很多東西!
回复:如何將數字列表轉換為字符列表?擴展傑夫的答案
Different overheads hurt for small sizes and help for large sizes.Different overheads hurt for small sizes and help for large sizes.不同的管理費用對於小尺寸會造成影響,而對於大尺寸則有幫助。
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
);回复:如何將數字列表轉換為字符列表?下面是 for 循環、foreach 和使用數據表的自定義函數這三種方法的快速計時程序。
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);
對於我來說,使用上面顯示的列表大小,三種方法之間的結果非常相似:
foreachloop = 1106974;
customfunction = 1077862;
forloop = 1400643;
回复:如何將數字列表轉換為字符列表?謝謝@傑夫·珀金森!
出於好奇,我做了一些模擬來比較每個解決方案的執行時間,似乎每個函數平均是最快的!
所以我會選擇那個,儘管功能@tx尼爾森效果也很好。
感謝你們倆 :)
回复:如何將數字列表轉換為字符列表?JMP 16 中的新功能是對於 Each() 函數它迭代容器(列表、矩陣或關聯數組)以對每個元素執行操作。
下面是一個示例,展示如何使用它將數字列表轉換為字符串列表。
Names Default To Here( 1 );
theList = {7, 8, 9};
For Each( {value, index}, theList, theList[index] = Char( value ) );
回复:如何將數字列表轉換為字符列表?感謝您的回答@tx尼爾森這確實是我一直在尋找的東西。
我只是想知道循環和涉及表創建的函數之間哪個更快。 任何想法?
回复:如何將數字列表轉換為字符列表?這是一個小腳本,它創建一個可以執行您想要的操作的函數。您可以在代碼中定義並使用該函數,也可以使用開放代碼中的 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 );