識別清單中的同名項目我想知道是否有一種巧妙的方法來識別清單中彼此重複的項目。我的清單如下:
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
我想返回列表中“Per”的所有位置。 IE
[3, 4, 5, 6, 7]
我可以循環查看列表以獲得答案。但是有沒有其他方法可以避免循環呢?
自動化和腳本編寫回覆:識別清單中的同名項目彼得,
可能有更好的方法來做到這一點,
(請參閱 Stan 的回覆以獲得正確的解決方案。)
但這是我在漫長的一天結束時創建的解決方案。它採用您的值矩陣並建立一個關聯數組,其中包含值矩陣中具有重複值的每個值的條目以及為該鍵找到的所有位置。
Names Default To Here( 1 );
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
dt = New Table( "test", private, New Column( "val", character ) );
dt:val << set values( values );
array = Associative Array( values );
uniqs = array << get keys;
For Each( {vals}, uniqs,
positions = dt << get rows where( :val == vals );
If( Length( positions ) > 1,
array << insert item( vals, positions ),
array << remove item( vals )
);
);
Close( dt, nosave );
回覆:識別清單中的同名項目嗨@pmroz
你可以使用Loc 函數——
loc(值,「每」);
乾杯,
史丹
//:*/
值= {“ABC”,“DEF”,“每”,“每”,“每”,“每”,“每”,“XYZ”,“UVW”};
loc(值,「每」)
/*:
[3,4,5,6,7]
回覆:識別清單中的同名項目如果您只想精確匹配,在 JM18 之前可以使用 Loc ,在 JMP18Where ()中
Names Default To Here(1);
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
idx1 = Loc(values, "Per"); // Before JMP17
idx2 = Where(values == "Per"); // JMP18
show(idx1, idx2);
此外,如果您甚至需要 JMP18 中的非精確匹配,Where() 也可以做到這一點
Names Default To Here(1);
values = {"APerBC", "PerDEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
idx2 = Where(Contains(values, "Per")); // JMP18
show(idx2);回覆:識別清單中的同名項目我認為 loc() 只適用於數字。衛生部!很棒的解決方案。
謝謝大家!
-彼得
回覆:識別清單中的同名項目很好的解決方案,斯坦。這是您的解決方案,它合併到我的程式碼中,用於檢查所有重複值。
Names Default To Here( 1 );
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
array = Associative Array( values );
uniqs = array << get keys;
For Each( {vals}, uniqs,
positions = loc(values, vals);
If( Length( positions ) > 1,
array << insert item( vals, positions ),
array << remove item( vals )
);
);回覆:識別清單中的同名項目這是一個不需要寫任何循環的解決方案。此方法適用於您的範例,也適用於多個重複值,而無需在程式碼中識別重複值。
names default to here(1);
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
// make data table with values //
dt = new table("item table" /*, private*/);
dt << new column("Items", character, nominal, set values(values));
// identify the duplicate rows //
dt << Select duplicate rows( Match( :Items ) );
// if you also want the first of the duplicate values, otherwise skip the next two lines //
dt << Go To( :Items );
dt << Select All Matching Cells();
// save the selected row results //
dupLocations = dt << get selected rows();
// clean up the data table //
close(dt, no save);
show(dupLocations);