ProblemSie haben Daten in einer oder mehreren Listen oder Matrixvektoren, die Sie sortieren müssen.
LösungVerwenden Sortierliste() oder Liste sortieren nach () , Rang() , oder legen Sie die Listen und Vektoren in eine Datentabelle und sortieren Sie sie.
// Sort List example (makes new list)
names = {"fred", "Andy", "Rory", "bess", "susy", "perl"};
sname = Sort List( names );
Show( names, sname );names = {"fred", "Andy", "Rory", "bess", "susy", "perl"}; // unverändert
sname = {"Andy", "bess", "fred", "perl", "Rory", "susy"}; // sortiert // Sort List Into example (in-place sort)
names = {"fred", "Andy", "Rory", "bess", "susy", "perl"};
Sort List Into( names );
Show( names );names = {"Andy", "bess", "fred", "perl", "Rory", "susy"}; // an Ort und Stelle sortiertBeide obigen Beispiele arbeiten mit einer einzigen Liste. Wenn es eine zweite Liste mit Telefonnummern gibt, halten sie sich nicht an die Namen.
Um mehrere Listen alle gleich sortieren zu lassen, können Sie die Funktion Rank() verwenden. Die Listen sollten die gleiche Anzahl von Elementen und keine fehlenden Werte in der Sortierschlüsselliste haben.
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"}; sphone = {"x322", "x324", "x321", "x326", "x323", "x325"}; Zimmer = {"1001", "1002", "1003", "1004", "1005", "1006"};
Oben sind die neuen Listen mit dem Präfix s alle nach Namen sortiert.
Wenn Sie mehrere Listen mit derselben Länge haben, die jedoch über die Listen hinweg gepaart sind, wäre eine Datentabelle vielleicht eine bessere Datenstruktur. Möglicherweise finden Sie es einfacher, eine Tabelle zu verwenden, da Sie sie sehen, speichern, unterteilen usw.Aber wenn Sie die Listen bereits haben, können Sie daraus eine Tabelle erstellen. Hier ist eine wiederverwendbare Benutzerfunktion, die das tut:
// 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
);Beispiel:
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 milesDie Listen befinden sich in den Spalten der Tabelle, sortiert nach MeilenWenn Sie mit Listen arbeiten, möchten Sie möglicherweise alle Listen wieder zurück. Hier ist eine Unzip-Funktion:
// 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
);Beispiel:
{cars, doors, miles, owner} = unzip( zippedDt );Liste ( 4 Elemente ) zugewiesen.
autos:{ford, volkswagen, chevy, honda, toyota}
Türen:[5, 2, 4, 2, 2]
Meilen: {10000, 20000, 30000, 40000, 50000}
Besitzer:{"penelope", "susan", "fred", "ralph", "terry"}
Endlich
// Important! delete the invisible table!
Close( zippedDt, nosave );
DiskussionAchten Sie darauf, die unsichtbare Tabelle zu bereinigen, wenn Sie die Zip/Unzip-Funktionen verwenden. (Sie haben nichts mit der Komprimierungsfunktion für .zip-Dateien zu tun. JMP unterstützt dies im ZIP-Archivobjekt.)
Die Datentabelle ist ein großartiges Werkzeug für komplizierte Datenstrukturen. Sie können versteckte oder private Tabellen zum Verwalten von Daten erstellen, ohne die oben genannten Wrapper-Funktionen zu verwenden. Listen sind möglicherweise effizienter als Datentabellen, wenn Sie viele Elemente hinzufügen und entfernen müssen (Warteschlangen und Stapel könnten langsam sein, wenn sie als Hinzufügen und Entfernen von Zeilen aus einer Tabelle implementiert werden). Die Zip-Funktion (oben) erwartet eine Liste von Namen . EIN Name (keine Anführungszeichen) ist nicht dasselbe wie a Zeichenfolge (verwendet Anführungszeichen) . Das Übergeben einer Namensliste verringert die Anzahl der Datenkopien.
Siehe auchhttps://www.jmp.com/support/help/14-2/list-functions.shtml