ProblèmeVous avez des données dans une ou plusieurs listes ou vecteurs matriciels que vous devez trier.
La solutionUtilisation Trier la liste() ou Trier la liste dans() , Rang() , ou placez les listes et les vecteurs dans un tableau de données et triez-le.
// Sort List example (makes new list)
names = {"fred", "Andy", "Rory", "bess", "susy", "perl"};
sname = Sort List( names );
Show( names, sname );noms = {"fred", "Andy", "Rory", "bess", "susy", "perl"} ; // inchangé
sname = {"Andy", "bess", "fred", "perl", "Rory", "susy"} ; // trié // Sort List Into example (in-place sort)
names = {"fred", "Andy", "Rory", "bess", "susy", "perl"};
Sort List Into( names );
Show( names );noms = {"Andy", "bess", "fred", "perl", "Rory", "susy"} ; // trié sur placeLes deux exemples ci-dessus fonctionnent sur une seule liste. S'il y a une deuxième liste de numéros de téléphone, ils ne collent pas aux noms.
Pour que plusieurs listes aient toutes le même tri, vous pouvez utiliser la fonction Rank(). Les listes doivent avoir le même nombre d'éléments et aucune valeur manquante dans la liste des clés de tri.
names = {"fred", "Andy", "Rory", "bess", "susy", "perl"};
phone = {"x321", "x322", "x323", "x324", "x325", "x326"};
rooms = {"1003", "1001", "1005", "1002", "1006", "1004"};
rnk = Rank( names ); // [2, 4, 1, 6, 3, 5]
// use the rnk vector to make sorted lists from the old lists
snames = names[rnk];
sphone = phone[rnk];
srooms = rooms[rnk];
Show( snames, sphone, srooms );snames = {"Andy", "bess", "fred", "perl", "Rory", "susy"} ; téléphone = {"x322", "x324", "x321", "x326", "x323", "x325"} ; salles = {"1001", "1002", "1003", "1004", "1005", "1006"} ;
Ci-dessus, les nouvelles listes avec le préfixe s sont toutes triées par nom.
Si vous avez plusieurs listes, de la même longueur, mais appariées entre les listes, peut-être qu'une table de données serait une meilleure structure de données. Vous trouverez peut-être plus facile d'utiliser un tableau car vous pouvez le voir, l'enregistrer, le sous-ensemble, ...Mais si vous avez déjà les listes, vous pouvez créer une table à partir d'elles. Voici une fonction utilisateur réutilisable qui fait cela :
// the zip function, named after a Python function that, like a zipper, zips two lists together
zip = Function( {variableNameList}, // a list of variable names
{iVarName, dt, data}, // local variables
dt = New Table( "zip", "invisible" ); // a hidden table, returned at end of this function
For( iVarName = 1, iVarName <= N Items( variableNameList ), iVarName += 1,
data = Eval( variableNameList[iVarName] ); // makes a copy of the data from the name
If( Is Matrix( data ) | Is Number( data[1] ), // handle lists of numbers same as a matrix
dt << New Column( Char( variableNameList[iVarName] ), "numeric", values( data ),
setProperty( "wasMatrix", eval(Is Matrix( data ) ) ) ) // remember how to convert back, could be list
, // else a list of strings
dt << New Column( Char( variableNameList[iVarName] ), "character", values( data ),
setProperty( "wasString", eval( Is String( data[1] ) ) ) ) // remember how to convert back, could be names
);
);
dt << New Column( "_original order_", values( 1 :: N Rows( dt ) ) ); // this extra column is not required, but might be useful
dt << setdirty( 0 ); // not required but avoids a "save?" prompt
dt; // return
);Exemple:
cars = {chevy, volkswagon, honda, ford, toyota}; // list of unquoted names
doors = [4, 2, 2, 5, 2]; // matrix of numbers
miles = {30000, 20000, 40000, 10000, 50000}; // list of numbers
owner = {"fred", "susan", "ralph", "penelope", "terry"}; // list of quoted strings
zippedDt = zip( {cars, doors, miles, owner} );
zippedDt << sort( by( miles ), replacetable( 1 ) );
zippedDt << show Window; // table hidden by default
Lists are in table's columns, sorted by milesLes listes sont dans les colonnes du tableau, triées par milesSi vous travaillez avec des listes, vous souhaiterez peut-être récupérer toutes les listes. Voici une fonction de décompression :
// unzip, similar to Python's unzip
unzip = Function( {dt}, // data table previously returned from zip (above)
{result, cols, iCol, col, names, iRow}, // local variables
cols = dt << getcolumnnames; // below, the _original order_ col gets skipped
result = {}; // assemble all of the lists and matrices here, return at bottom
For( iCol = 1, iCol < N Items( cols )/*skip last one*/, iCol += 1,
col = Column( dt, cols[icol] ); // the Ith col in the table
If( col << getdatatype( "English" ) == "Numeric", //
// return the same type of object, list or matrix, supplied originally
If( col << getproperty( "wasMatrix" ), // by checking the property we set above
Insert Into( result, col << getValues ); // append a matrix
, // else append a list of numbers
result[N Items( result ) + 1] = As List( dt[0, iCol] )
)
, // else character column
// return same type, list of names or list of strings...
If( col << getproperty( "wasString" ), // check character col prop set above
result[N Items( result ) + 1] = (dt[0, iCol]) // list of strings
, // else turn the strings into names again
result[N Items( result ) + 1] = As Name( dt[0, iCol] ) // list of names
)
);
);
result; // return
);Exemple:
{cars, doors, miles, owner} = unzip( zippedDt );Liste (4 éléments) assignée.
voitures :{ford, volkswagon, chevy, honda, toyota}
portes :[5, 2, 4, 2, 2]
milles :{10 000, 20 000, 30 000, 40 000, 50 000}
propriétaire :{"penelope", "susan", "fred", "ralph", "terry"}
Pour terminer
// Important! delete the invisible table!
Close( zippedDt, nosave );
DiscussionAssurez-vous de nettoyer la table invisible si vous utilisez les fonctions zip/unzip. (Ils ne sont pas liés à la fonction de compression des fichiers .zip. JMP prend en charge cela dans l'objet d'archive zip.)
La table de données est un excellent outil pour les structures de données complexes. Vous pouvez créer des tables masquées ou privées pour gérer les données sans utiliser les fonctions wrapper ci-dessus. Les listes peuvent être plus efficaces que les tables de données si vous devez ajouter et supprimer de nombreux éléments (les files d'attente et les piles peuvent être lentes si elles sont implémentées comme l'ajout et la suppression de lignes d'une table.) La fonction zip (ci-dessus) attend une liste de des noms . UN Nom (sans guillemets) n'est pas la même chose qu'un chaîne (utilise des guillemets) . Passer une liste de noms réduit le nombre de fois où les données sont copiées.
Voir égalementhttps://www.jmp.com/support/help/14-2/list-functions.shtml