當我們需要了解兩個或多個資料集的共同值、互斥值或唯一值時,就需要建立交集、差異和並集。 對於本月,建立三個函數:
- 路口(一個列表,清單) – 傳回兩者中包含的值的列表一個列表和清單。
- 不同之處(一個列表,清單) – 傳回兩個清單。 第一個包含以下值一個列表那些不在清單,第二個包含中的值清單那些不在一個列表。
- 聯盟(一個列表,清單) – 傳回所有值的列表一個列表和清單,刪除任何重複項。
例如,如果:
aList = {“a”,“b”,“c”,“d”,“e”,“e”}
bList = {“a”,“a”,“c”,“f”,“g”}
然後,
交集(aList,bList)=> {“a”,“c”}
差異(aList,bList)=> {{“b”,“d”,“e”},{“f”,“g”}}
union(aList,bList) => {“a”,“b”,“c”,“d”,“e”,“f”,“g”}
如需額外學分,請延長路口和聯盟取得三個或更多清單的清單。
使用關聯數組和遞歸。 該程式碼可能不是最容易理解的,因為我不是:使用明確命名的支援變量,使用遞歸和關聯數組,還缺少所有註釋。
Names Default To Here(1);
intersection = function({temp_list}, {Default Local},
Try(
tempAa = Associative Array(temp_list[1]);
tempAa << Intersect(AssociativeArray(temp_list[2])),
return("not enough lists provided");
);
If(N Items(temp_list) == 2,
return(tempAa << get keys);
);
If(N Items(temp_list) > 2,
recurse(Insert(EvalList({tempAa << get keys}), Remove(temp_list, 1,2)))
);
);
difference = function({firstList, secondList}, {Default Local},
tempAaFirst = Associative Array(firstList);
tempAaSecond = Associative Array(secondList);
tempAaFirst << Remove(Associative Array(secondList));
tempAaSecond << Remove(Associative Array(firstList));
return(Eval List({tempAaFirst << get keys, tempAaSecond << get keys}));
);
union = function({temp_list}, {Default Local},
Try(
Insert Into(temp_list[1], temp_list[2]),
return("not enough lists provided");
);
If(N Items(temp_list) == 2,
return(Associative Array(temp_list[1]) << get keys);
);
If(N Items(temp_list) > 2,
recurse(Insert(EvalList({Associative Array(temp_list[1]) << get keys}), Remove(temp_list, 1,2)))
);
);
//test cases
Clear log();
aList = {"a","b","c","d","e","e"};
bList = {"a","a","c","f","g"};
cList = {"a", "b", "c", "h"};
dList = {"i", "j", "k"};
Print("intersection()");
Show(intersection(Eval List({aList})));
Show(intersection(Eval List({aList, bList})));
Show(intersection(Eval List({aList, bList, cList})));
Show(intersection(Eval List({aList, bList, cList, dList})));
Print("\!Ndifference()");
Show(difference(aList, bList));
Print("\!Nunion()");
Show(union(Eval List({aList})));
Show(union(Eval List({aList, bList})));
Show(union(Eval List({aList, bList, cList})));
Show(union(Eval List({aList, bList, cList, dList})));至少在使用關聯數組時刪除重複值時可能會有點慢,至少在使用 Summarize 從資料表獲取唯一值時會變得更快。