不使用 for 迴圈轉置列表列表我想要一種在不使用 for 迴圈的情況下轉置清單清單的方法。 也就是說,某些函數(例如,稱為“Listtranspose”)可以翻轉列表列表的“行”和“列”,如下所示:
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
tranlist = Listtranspose(listlist);
Show(tranlist);
/*Result:
{{"cat", "meow"}, {"dog", "bark"}, {"mouse", "squeak}}
替代實作可能類似:
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
nr = NItems(listlist);
col1 = listlist[1::nr][1];
col2 = listlist[1::nr][2];
col3 = listlist[1::nr][3];
translist = EvalList({col1, col2, col3});
我更喜歡後一種實現,因為我可能只需要轉置「列」的子集,而不是整個清單。
當然,這可以使用 For 循環來完成,但要求這樣做的原因是 For 循環可能很慢。 我處理大塊文本,我相信這將幫助我大大加快速度。
歸功於@vince_faller最初問這個問題。不使用 for 迴圈轉置列表列表
自動化和腳本編寫回覆:在沒有 for 迴圈的情況下轉置列表列表再想一想這個問題。我仍然無法擊敗 for 循環,但我想我會把它寫下來,以防它對任何人有幫助。
// make a blank data table with the right shape
dt = As Table(J(nr, nc, .), <<PRIVATE></PRIVATE>
回覆:在沒有 for 迴圈的情況下轉置列表列表@Craige_Hales感謝克雷格的深刻見解。 我同意,我對 for 迴圈與平行分配方法進行了速度測試,並行分配速度要慢得多。 我的列表數組為 718r x 14182c,因此超過 1000 萬個元素。 我運行腳本約 10 分鐘,但操作未完成。 這似乎比上面的資料預測的要慢一點,但是要考慮的變數太多(例如電腦系統、列與行的比率?)。 對於同一個表,For 循環速度要快得多,約為 10.1 秒。
但仍然比我想要的慢。 如果有一個 JMP 函數可以在內部執行此操作,那就太好了。
回覆:在沒有 for 迴圈的情況下轉置列表列表但是,經過一些測試,我認為簡單的嵌套循環將比任何其他基於 JSL 的方法更快。
result = {};
for( c = 1, c <= nc, c += 1,
thisrow = {}; // build a row from a column
for( r = 1, r <= nr, r += 1,
thisrow[r] = testList[r][c];
);
result[c] = thisrow;
);@唐麥考馬克- 挑戰!
The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.The blue-line for-loop is consistently better. The purple JSON-table might overtake it, but I'm running out of memory. The parallel-assign trick begins to fail for large numbers.藍線 for 迴圈始終更好。 紫色 JSON 表可能會超越它,但我的記憶體不足了。 對於大量數據,並行分配技巧開始失效。
並行分配可能始終會阻塞執行緒之間的衝突。 它首先擊敗了 json 數據表,因為兩者之間的開銷不同。
回覆:在沒有 for 迴圈的情況下轉置列表列表是的,如果有更多的列表操作函數就好了。 我想不出一個好的或快速的方法,但玩了一下之後想出了這個。 它需要 JMP 15,在 14 中失敗。
list = {{"lion", "tiger", "puma"}, {"lamp", "torch", "pharos"}, {"lark", "toucan", "pigeon"}, {"lawn", "terrace", "patio"}};
jlist = As JSON Expr( list );
dt1 = JSON To Data Table( jlist, invisible(1) );
dt1 << New Column( "row", numeric, setvalues( 1 + Floor( (0 :: (N Rows( dt1 ) - 1)) / N Items( list[1] ) ) ) );
dt2 = dt1 << Split( Split By( :row ), Split( column(dt1,1) ), Sort by Column Property, invisible(1) );
Close( dt1, nosave );
transposed = dt2[0, 0];
Close( dt2, nosave );
Show( list, transposed );list = {{"lion", "tiger", "puma"}, {"lamp", "torch", "pharos"}, {"lark", "toucan", "pigeon"}, {"lawn", 「露台」、「天井」}};
轉置 = {{"獅子", "燈", "雲雀", "草坪"}, {"老虎", "火把", "巨嘴鳥", "露台"}, {"美洲獅", "法羅斯", "鴿子", "庭院"}};
取消隱藏中間表以查看它正在做什麼。 真正的解決方案應該處理長度不等的行。
回覆:在沒有 for 迴圈的情況下轉置列表列表@Craige_Hales寫了一個我經常使用的很好的解釋。使用並行分配進行多執行緒故障排除
回覆:在沒有 for 迴圈的情況下轉置列表列表@vince_faller
頭腦==炸了。
以前從未聽過並行分配功能。 我嘗試過這個,是的,它有效。 儘管我正在處理字串,並且這在技術上是一個矩陣函數,但它並不關心。 玩這個會很有趣,看看它是否比 for 循環更快。 一旦我知道,我會嘗試在這裡更新。
謝謝你的主意!
回覆:在沒有 for 迴圈的情況下轉置列表列表我發誓我看到有人做了類似的事情
{"cat", "dog", "mouse", "meow", "bark", "squeak"}[[1 1, 1 1]]
// and had it return
{{"cat", "cat"}, {"cat", "cat"}}
在發現演講期間,但我從未能夠重新創建它。這一切都可能是一場夢嗎?
如果我沒記錯的話,他們以某種方式從一個平面列表中像這樣一行形成了一個新列表。應該是我沒記錯吧。
話雖這麼說,你可能可以非常快速地進行並行分配
names default to here(1);
listlist = {{"cat", "dog", "mouse"}, {"meow", "bark", "squeak"}};
m = J(nc, nr, -1);
::trans_list = Aslist(m);
Parallel Assign({l = listlist},
m[a, b] = (
::trans_list[a][b] = l[b][a];
)
);
show(::trans_list);