Identifizieren gleichnamiger Elemente in einer ListeIch frage mich, ob es eine raffinierte Möglichkeit gibt, Elemente in einer Liste zu identifizieren, die Duplikate voneinander sind. Meine Liste sieht folgendermaßen aus:
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
Ich möchte alle Positionen von „Per“ in der Liste zurückgeben. D.h.
[3, 4, 5, 6, 7]
Ich kann die Liste durchlaufen, um die Antwort zu erhalten. Aber gibt es eine andere Möglichkeit, die Schleife zu vermeiden?
Automatisierung und SkriptingBetreff: Identifizieren gleichnamiger Elemente in einer ListePeter,
Es gibt vielleicht einen besseren Weg, dies zu tun.
(Die richtige Lösung finden Sie in Stans Antwort.)
aber hier ist meine Lösung, die ich am Ende eines langen Tages erstellt habe. Sie nimmt Ihre Wertematrix und erstellt ein assoziatives Array mit einem Eintrag für jeden Wert in der Wertematrix, der doppelte Werte und alle für den Schlüssel gefundenen Positionen enthält.
Names Default To Here( 1 );
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
dt = New Table( "test", private, New Column( "val", character ) );
dt:val << set values( values );
array = Associative Array( values );
uniqs = array << get keys;
For Each( {vals}, uniqs,
positions = dt << get rows where( :val == vals );
If( Length( positions ) > 1,
array << insert item( vals, positions ),
array << remove item( vals )
);
);
Close( dt, nosave );
Betreff: Identifizieren gleichnamiger Elemente in einer ListeHallo @pmroz
Sie könnten die Loc-Funktion verwenden -
loc(Werte, "Pro" );
Prost,
Stan
//:*/
Werte = {"ABC", "DEF", "Pro", "Pro", "Pro", "Pro", "Pro", "XYZ", "UVW"};
loc(Werte, "Pro")
/*:
[3, 4, 5, 6, 7]
Betreff: Identifizieren gleichnamiger Elemente in einer ListeWenn Sie nur exakte Übereinstimmungen wünschen, konnten Sie vor JM18 „Loc“ und in JMP18 „Where()“ verwenden.
Names Default To Here(1);
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
idx1 = Loc(values, "Per"); // Before JMP17
idx2 = Where(values == "Per"); // JMP18
show(idx1, idx2);
Auch wenn Sie in JMP18 nicht exakte Übereinstimmungen benötigen, kann Where() dies tun
Names Default To Here(1);
values = {"APerBC", "PerDEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
idx2 = Where(Contains(values, "Per")); // JMP18
show(idx2);Betreff: Identifizieren gleichnamiger Elemente in einer ListeIch dachte, loc() funktioniert nur mit Zahlen. DOH! Tolle Lösungen.
Danke an alle!
-Peter
Betreff: Identifizieren gleichnamiger Elemente in einer ListeGute Lösung, Stan. Hier ist deine Lösung, die in meinen Code integriert ist und alle sich wiederholenden Werte prüft.
Names Default To Here( 1 );
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
array = Associative Array( values );
uniqs = array << get keys;
For Each( {vals}, uniqs,
positions = loc(values, vals);
If( Length( positions ) > 1,
array << insert item( vals, positions ),
array << remove item( vals )
);
);Betreff: Identifizieren gleichnamiger Elemente in einer ListeHier ist eine Lösung, die keine Schleifen erfordert. Diese Methode funktioniert in Ihrem Beispiel und auch bei mehreren doppelten Werten, ohne dass die doppelten Werte im Code identifiziert werden müssen.
names default to here(1);
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
// make data table with values //
dt = new table("item table" /*, private*/);
dt << new column("Items", character, nominal, set values(values));
// identify the duplicate rows //
dt << Select duplicate rows( Match( :Items ) );
// if you also want the first of the duplicate values, otherwise skip the next two lines //
dt << Go To( :Items );
dt << Select All Matching Cells();
// save the selected row results //
dupLocations = dt << get selected rows();
// clean up the data table //
close(dt, no save);
show(dupLocations);