Die Notwendigkeit, Schnittmengen, Unterschiede und Vereinigungen zu schaffen, entsteht, wenn wir Werte kennen müssen, die zwei oder mehr Datensätzen gemeinsam, exklusiv oder eindeutig sind. Erstellen Sie für diesen Monat drei Funktionen:
- Kreuzung ( aList , bList ) – Gibt eine Liste von Werten zurück, die sowohl in aList als auch in bList enthalten sind.
- Differenz ( aList , bList ) – Gibt zwei Listen zurück. Der erste enthält die Werte in aList , die nicht in bList enthalten sind, der zweite enthält die Werte in bList , die nicht in aList enthalten sind.
- Union ( aList , bList ) – Gibt eine Liste aller Werte in aList und bList zurück und entfernt alle Duplikate.
Wenn zum Beispiel:
aList = {„a“, „b“, „c“, „d“, „e“, „e“}
bList = {„a“, „a“, „c“, „f“, „g“}
Dann,
Schnittpunkt(aList,bList) => {„a“, „c“}
Differenz(aListe,bListe) => {{„b“, „d“, „e“},{„f“, „g“}}
union(aList,bList) => {„a“, „b“, „c“, „d“, „e“, „f“, „g“}
Erweitern Sie für zusätzliche Kreditwürdigkeit die Schnittmenge und die Vereinigungsmenge , um eine Liste mit drei oder mehr Listen zu erhalten.
Verwendung assoziativer Arrays und Rekursion. Der Code ist möglicherweise nicht am einfachsten zu verstehen, weil ich nicht: klar benannte unterstützende Variablen verwende, Rekursion und assoziative Arrays verwende und außerdem alle Kommentare fehlen.
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})));Könnte zumindest beim Entfernen doppelter Werte bei der Verwendung assoziativer Arrays etwas langsam werden, zumindest wenn das Abrufen eindeutiger Werte aus Datentabellen mithilfe von Summarize irgendwann schneller wird.