共通の値、排他的な値、または 2 つ以上のデータ セットに固有の値を知る必要がある場合、交差、差分、和集合を作成する必要性が生じます。今月は、次の 3 つの関数を作成します。
- Intersection ( aList , bList ) – aListとbListの両方に含まれる値のリストを返します。
- Difference ( aList , bList ) – 2 つのリストを返します。 1 つ目は、 bListにないaListの値を含み、2 つ目は、 aListにはないbListの値を含みます。
- Union ( aList , bList ) – aListとbList内のすべての値のリストを返し、重複を削除します。
たとえば、次のような場合です。
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"}
追加のクレジットとして、交差と結合を拡張して 3 つ以上のリストのリストを取得します。
連想配列と再帰を使用します。このコードは、明確に名前が付けられたサポート変数を使用したり、再帰配列や連想配列を使用したり、すべてのコメントを欠落したりすることができないため、最も理解しやすいものではないかもしれません。
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 を使用してデータテーブルから一意の値を取得する速度が向上する場合、連想配列を使用するときに重複した値を削除するときに少し遅くなる可能性があります。