Identifier les éléments du même nom dans une listeJe me demande s'il existe un moyen astucieux d'identifier les éléments d'une liste qui sont des doublons les uns des autres. Ma liste ressemble à ceci :
values = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
Je souhaite renvoyer toutes les positions de "Per" dans la liste. C'est à dire
[3, 4, 5, 6, 7]
Je peux parcourir la liste pour obtenir la réponse. Mais existe-t-il un autre moyen d’éviter la boucle ?
Automatisation et scriptRe : Identifier les éléments du même nom dans une listePierre,
Il y a peut-être une meilleure façon de procéder,
(Voir la réponse de Stan pour la bonne solution.)
mais voici ma solution créée à la fin d'une longue journée. Il prend votre matrice de valeurs et crée un tableau associatif avec une entrée pour chaque valeur dans la matrice de valeurs qui contient des valeurs en double et toutes les positions trouvées pour la clé.
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 );
Re : Identifier les éléments du même nom dans une listeSalut @pmroz
Vous pouvez utiliser la fonction Loc --
loc(valeurs, "Par" );
acclamations,
Stan
//:*/
valeurs = {"ABC", "DEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"} ;
loc(valeurs, "Par")
/* :
[3, 4, 5, 6, 7]
Re : Identifier les éléments du même nom dans une listeSi vous voulez uniquement des correspondances exactes, avant JM18, vous pouvez utiliser Loc et dans JMP18 Where()
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);
De plus, si vous avez besoin de correspondances même non exactes dans JMP18, Where() est capable de le faire
Names Default To Here(1);
values = {"APerBC", "PerDEF", "Per", "Per", "Per", "Per", "Per", "XYZ", "UVW"};
idx2 = Where(Contains(values, "Per")); // JMP18
show(idx2);Re : Identifier les éléments du même nom dans une listeJe pensais que loc() ne fonctionnait que sur les nombres. DOH ! Excellentes solutions.
Merci a tous!
-Pierre
Objet : Identifier les éléments portant le même nom dans une listeBonne solution, Stan. Voici votre solution intégrée à mon code qui vérifie toutes les valeurs répétitives.
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 )
);
);Objet : Identifier les éléments portant le même nom dans une listeVoici une solution qui ne nécessite aucune boucle. Cette méthode fonctionne sur votre exemple et fonctionne également avec plusieurs valeurs dupliquées sans avoir à les identifier dans le code.
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);