La necesidad de crear intersecciones, diferencias y uniones surge cuando necesitamos conocer valores en común, exclusivos o únicos de dos o más conjuntos de datos. Para este mes, crea tres funciones:
- intersección ( aList , bList
devuelve una lista de valores contenidos tanto en aList como en bList .
- diferencia ( aList , bList
devuelve dos listas. El primero contiene los valores en aList que no están en bList , el segundo contiene los valores en bList que no están en aList .
- unión ( aList , bList
devuelve una lista de todos los valores en aList y bList , eliminando cualquier duplicado.
Por ejemplo, si:
unaLista = {“a”,”b”,”c”,”d”,”e”,”e”}
bLista = {“a”,”a”,”c”,”f”,”g”}
entonces,
intersección(aList,bList) => {“a”,”c”}
diferencia(aList,bList) => {{“b”,”d”,”e”},{“f”,”g”}}
union(aList,bList) => {“a”,”b”,”c”,”d”,”e”,”f”,”g”}
Para obtener crédito adicional, extienda intersección y unión para obtener una lista de tres o más listas.
Uso de matrices asociativas y recursividad. Es posible que el código no sea más fácil de entender porque no lo estoy haciendo: usando variables de soporte con nombres claros, usando recursividad y matrices asociativas, y también me faltan todos los comentarios.
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})));Puede volverse un poco lento al menos al eliminar valores duplicados cuando se usan matrices asociativas, al menos cuando obtener valores únicos de tablas de datos usando Summarize se vuelve más rápido en algún momento.