OVH Cloud OVH Cloud

hallu

10 réponses
Avatar
Antoun
Hello,

De mémoire, il me semblait qu'il existait des fonctions natives pour les
manipulations classiques de tableaux ou de hash, du genre

- rechercher une valeur et récupérer l'indice ou clé correspondant(e)

- dédoublonner les valeurs

Ai-je rêvé ?

Antoun

PS : Btw, si j'ai un tableau de clés et un tableau de valeurs, y a-t-il
un moyen de les fusionner en un hash sans faire de boucle ?

10 réponses

Avatar
Emmanuel Florac
Le Thu, 15 Sep 2005 06:06:02 +0200, Antoun a écrit :


De mémoire, il me semblait qu'il existait des fonctions natives pour les
manipulations classiques de tableaux ou de hash, du genre

- rechercher une valeur et récupérer l'indice ou clé correspondant(e)


Il y a "grep" pour ça.

- dédoublonner les valeurs


Il suffit de "retourner" le tableau ou le hash, puis de le remettre à
l'endroit :

my %h=(toto=>1, tata=>2, titi=>3, tete=>2 );
my %reverseh= map { $h{$_} => $_ } keys %h;
my %uniqh = map {$_ => $h{$_} } values %reverseh ;

Pour un tableau c'est carrément très simple, il suffit de le copier dans
un hash :

my @t=qw( 1 2 3 4 5 6 6 7 1);

my %h = map { $_ => 0 } @t;

Si on veut conserver les numéros d'ordre, on peut ajouter un compteur :

my @t=qw( 1 2 3 4 5 6 6 7 1);
my $i=0;
my %h = map { $_ => $i++ } @t;

# pour retrouver le tableau:
my @uniqt;
foreach ( keys %h) { $uniqt[$h{$_}]=$_ }




--
Si ça a l'air facile, c'est difficile. Si ça a l'air difficile, c'est
carrément impossible. Si ça a l'air impossible, c'est un compilateur
Ada.
Théorème de Stockmayer.

Avatar
Paul Gaborit
À (at) Thu, 15 Sep 2005 06:06:02 +0200,
Antoun écrivait (wrote):
De mémoire, il me semblait qu'il existait des fonctions natives pour
les manipulations classiques de tableaux ou de hash, du genre

- rechercher une valeur et récupérer l'indice ou clé correspondant(e)


Non.

- dédoublonner les valeurs


Non plus.

Ai-je rêvé ?


Oui.

Toutes ces fonctions n'ont rien de « classiques ». En fait leur
implémentation optimale dépend beaucoup de la nature des données et de
ce qu'on veut vraiment faire. Par exemple, une recherche ne se fait
pas de la même manière si les valeurs dans un tableau sont ordonnées
ou non.

Ceci étant, Perl permet très facilement de programmer ces fonctions de
manière adaptée à chaque situation.

PS : Btw, si j'ai un tableau de clés et un tableau de valeurs, y
a-t-il un moyen de les fusionner en un hash sans faire de boucle ?


%hash = map {($cles[$_] => $valeurs[$_])} 0..$#cles;

Mais c'est une boucle implicite... et je ne suis pas sûr que ce soit
plus efficace qu'une boucle explicite ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Antoun
Emmanuel Florac wrote:


De mémoire, il me semblait qu'il existait des fonctions natives pour les
manipulations classiques de tableaux ou de hash, du genre

- rechercher une valeur et récupérer l'indice ou clé correspondant(e)



Il y a "grep" pour ça.


ah, c'est ça !

- dédoublonner les valeurs



Il suffit de "retourner" le tableau ou le hash, puis de le remettre à
l'endroit :

my %h=(toto=>1, tata=>2, titi=>3, tete=>2 );
my %reverseh= map { $h{$_} => $_ } keys %h;
my %uniqh = map {$_ => $h{$_} } values %reverseh ;


OK

Pour un tableau c'est carrément très simple, il suffit de le copier dans
un hash :

my @t=qw( 1 2 3 4 5 6 6 7 1);

my %h = map { $_ => 0 } @t;

Si on veut conserver les numéros d'ordre, on peut ajouter un compteur :

my @t=qw( 1 2 3 4 5 6 6 7 1);
my $i=0;
my %h = map { $_ => $i++ } @t;

# pour retrouver le tableau:
my @uniqt;
foreach ( keys %h) { $uniqt[$h{$_}]=$_ }


donc en fait, il n'y a pas de fonction standard, mais on peut le faire
sans boucle avec des map ou des grep...

Merci !

Antoine


Avatar
Antoun
Paul Gaborit wrote:
À (at) Thu, 15 Sep 2005 06:06:02 +0200,
Antoun écrivait (wrote):

De mémoire, il me semblait qu'il existait des fonctions natives pour
les manipulations classiques de tableaux ou de hash, du genre

- rechercher une valeur et récupérer l'indice ou clé correspondant(e)



Non.


- dédoublonner les valeurs



Non plus.


Ai-je rêvé ?



Oui.

Toutes ces fonctions n'ont rien de « classiques ».


elles sont dans PHP (ce doit d'ailleurs être la cause de ma méprise).

En fait leur
implémentation optimale dépend beaucoup de la nature des données et de
ce qu'on veut vraiment faire. Par exemple, une recherche ne se fait
pas de la même manière si les valeurs dans un tableau sont ordonnées
ou non.


OK

Ceci étant, Perl permet très facilement de programmer ces fonctions de
manière adaptée à chaque situation.


PS : Btw, si j'ai un tableau de clés et un tableau de valeurs, y
a-t-il un moyen de les fusionner en un hash sans faire de boucle ?



%hash = map {($cles[$_] => $valeurs[$_])} 0..$#cles;

Mais c'est une boucle implicite... et je ne suis pas sûr que ce soit
plus efficace qu'une boucle explicite ;-)


joli le 0..$#cles !

Merci !

Antoun


Avatar
Jacques Caron
Salut,

On Fri, 16 Sep 2005 07:06:56 +0200, Antoun wrote:

donc en fait, il n'y a pas de fonction standard, mais on peut le faire
sans boucle avec des map ou des grep...


Un map ou un grep est une boucle (avec quelques extras intégrés). En gros:

my @b = map { A } @a est équivalent à:

my @b;
for (@a)
{
push @b,A;
}

Et:

my @b = grep { A } @a est équivalent à:

my @b;
for (@a)
{
push @b,$_ if A;
}

Mais A sera bien éxécuté autant de fois qu'il y a d'éléments dans @a, donc
c'est une boucle...

Jacques.

Avatar
Emmanuel Florac
Le Fri, 16 Sep 2005 07:06:56 +0200, Antoun a écrit :


donc en fait, il n'y a pas de fonction standard, mais on peut le faire
sans boucle avec des map ou des grep...


Exactement!

--
A thing of beauty is a joy forever.
J. Keats.

Ah! Singe débotté, hisse un jouet fort et vert!
Marcel Bénabou.

Avatar
Emmanuel Florac
Le Fri, 16 Sep 2005 09:25:54 +0200, Jacques Caron a écrit :


Un map ou un grep est une boucle (avec quelques extras intégrés).


Non, car l'ordre d'éxécution n'est pas prédéfini. Et il est possible
que l'évaluation du map/grep soit "paresseuse", est-ce qu'un habitué de
la programmation fonctionnelle pourrait infirmer ou confirmer?

--
Quis, quid, ubi, quibus auxiliis, cur, quomodo, quando

Avatar
Paul Gaborit
À (at) Fri, 16 Sep 2005 09:36:41 +0200,
Emmanuel Florac écrivait (wrote):
Le Fri, 16 Sep 2005 09:25:54 +0200, Jacques Caron a écrit :
Un map ou un grep est une boucle (avec quelques extras intégrés).


Non, car l'ordre d'éxécution n'est pas prédéfini. Et il est possible
que l'évaluation du map/grep soit "paresseuse", est-ce qu'un habitué de
la programmation fonctionnelle pourrait infirmer ou confirmer?


Dans les implémentations actuelles de Perl, l'ordre d'évaluation est
défini (celui des éléments fournis) et l'évaluation n'est ni
paresseuse (n'évaluer que si on en a besoin) ni retardée (n'évaluer
qu'au moment où en a besion).

Dans l'absolu, tout cela peut changer... mais pas avant un bon moment
à mon avis ;-)

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Antoun
Dans les implémentations actuelles de Perl, l'ordre d'évaluation est
défini (celui des éléments fournis) et l'évaluation n'est ni
paresseuse (n'évaluer que si on en a besoin) ni retardée (n'évaluer
qu'au moment où en a besion).

Dans l'absolu, tout cela peut changer... mais pas avant un bon moment
à mon avis ;-)



et donc, est qu'un grep/map est plus performant qu'une boucle, ou bien
c'est la même chose ?

Avatar
Mark Clements
Antoun wrote:
Dans les implémentations actuelles de Perl, l'ordre d'évaluation est
défini (celui des éléments fournis) et l'évaluation n'est ni
paresseuse (n'évaluer que si on en a besoin) ni retardée (n'évaluer
qu'au moment où en a besion).

Dans l'absolu, tout cela peut changer... mais pas avant un bon moment
à mon avis ;-)



et donc, est qu'un grep/map est plus performant qu'une boucle, ou bien
c'est la même chose ?
¨

Je pense que c'est la même chose, mais ça depend sur l'algorithme. On
peut toujours verifier avec Benchmark::Timer :)

Mark