• Publicidad

Comparar dos hash y extraer información

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Comparar dos hash y extraer información

Notapor FoRsUs » 2011-04-22 07:31 @355

Hola amigos,

Soy nuevo en este foro. Ya llevo un tiempo trabajando con Perl y me encanta, pero ahora mismo me encuentro en uno de esos puntos que no sé qué hacer. He mirado muchos tutoriales y páginas diferentes y no he conseguido hallar la respuesta, así pues me he decidido a pediros consejo.

Mi problema es el siguiente:

Tengo datos almacenados en dos hash diferentes. A continuación os muestro cómo se organiza la información dentro de estos dos hash:

%HASH_1=(
{1} = Grupo1;
{2} = Grupo1;
{3} = Grupo1;
{3} = Grupo2;
{5} = Grupo2;
{4} = Grupo3;
{2} = Grupo3;
{1} = Grupo3;
{5} = Grupo3;
);

%HASH_2=(
{3} = Grupo1;
{2} = Grupo1;
{7} = Grupo1;
{2} = Grupo2;
{1} = Grupo2;
{2} = Grupo3;
{1} = Grupo3;
{3} = Grupo3;
{5} = Grupo3;
);

Es a modo de ejemplo porque el hash contiene más información, pero para el caso ya me vale.

Lo que intento hacer es:
  • Comparar los dos hash mediante la condición SI CLAVES IGUALES Y VALORES DIFERENTES. El objetivo es encontrar coincidencias de claves que tengan valores diferentes y contabilizar cada tipo de coincidencia.
  • Luego construir dos estructuras de datos que alberguen la siguiente información: una que guarde las que presentan más coincidencias y la otra que guarde las que presentan menos coincidencias. Estas estructuras de datos no pueden contener las claves coincidentes, lo que sí deben contener son los valores asociados a las claves coincidentes.


No pretendo que me solucionéis el problema, pero lo que sí os pido, si podéis, es alguna orientación para solucionarlo.

Muchas gracias.
Un saludo.
FoRsUs
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-04-02 17:40 @778

Publicidad

Re: Comparar dos hash y extraer información

Notapor explorer » 2011-04-22 13:20 @597

Bienvenido a los foros de Perl en español, FoRsUs.

Supongo que ya lo sabes: las claves de los hash son únicos, así que los ejemplos que has puesto no valen (hay claves repetidas).

Para comparar dos hash, puedes recorrer por sus claves, y mirando por los valores. Algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. for my $clave1 (keys %hash1) {
  2.     if (exists $hash2{$clave1}  and  $hash1{$clave1} eq $hash2{$clave2}) {
  3.         print "Misma clave [$clave1], pero distinto valor\n";
  4.     }
  5. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Fíjate que he usado una comparación de cadenas (eq). Depende del tipo de dato, así tendrás que hacer cambios en la comparación.

No hace falta recorrer las claves de %hash2, porque ya el primer bucle identifica las claves coincidentes entre los dos.

No entiendo lo que dices de contabilizar las coincidencias... las claves son únicas, por lo que solo aparecen una vez.

Quizás sería interesante saber más detalles de esto, por si se puede hacer de otra manera más eficiente.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Comparar dos hash y extraer información

Notapor FoRsUs » 2011-04-23 04:52 @244

Hola explorer,

Gracias por el detalle de las claves porque a mí se me pasó y me dí cuenta que estaba perdiendo información por el camino.

Revisé el código y ahora he modificado la estructura de los dos HASH: básicamente he puesto la información en un Array de Hash, de manera que ahora tengo:

@AoH_1 = (
{
{1} = Grupo1;
{2} = Grupo1;
{3} = Grupo1;
{3} = Grupo2;
{5} = Grupo2;
{4} = Grupo3;
{2} = Grupo3;
{1} = Grupo3;
{5} = Grupo3;
etc...
}
);
@AoH_2 = (
{3} = Grupo1;
{2} = Grupo1;
{7} = Grupo1;
{2} = Grupo2;
{1} = Grupo2;
{2} = Grupo3;
{1} = Grupo3;
{3} = Grupo3;
{5} = Grupo3;
etc...
);

La idea es la misma de antes: establecer un método de comparación entre los dos arrays y contabilizar las claves que sean idénticas y tengan valores diferentes.

Muchas gracias.
Un saludo.
FoRsUs
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2011-04-02 17:40 @778

Re: Comparar dos hash y extraer información

Notapor explorer » 2011-04-23 11:29 @520

Bien, la información se puede colocar como un array de hash:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @AoH_1 = (
    { 1 => 'Grupo1' },
    { 2 => 'Grupo1' },
    { 3 => 'Grupo1' },
    { 3 => 'Grupo2' },
    { 5 => 'Grupo2' },
    { 4 => 'Grupo3' },
    { 2 => 'Grupo3' },
    { 1 => 'Grupo3' },
    { 5 => 'Grupo3' },
);

my @AoH_2 = (
    { 3 => 'Grupo1' },
    { 2 => 'Grupo1' },
    { 7 => 'Grupo1' },
    { 2 => 'Grupo2' },
    { 1 => 'Grupo2' },
    { 2 => 'Grupo3' },
    { 1 => 'Grupo3' },
    { 3 => 'Grupo3' },
    { 5 => 'Grupo3' },
);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
aunque también se puede poner como un array de array:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @AoA_1 = (
    [ 1 => 'Grupo1' ],
    [ 2 => 'Grupo1' ],
    [ 3 => 'Grupo1' ],
    [ 3 => 'Grupo2' ],
    [ 5 => 'Grupo2' ],
    [ 4 => 'Grupo3' ],
    [ 2 => 'Grupo3' ],
    [ 1 => 'Grupo3' ],
    [ 5 => 'Grupo3' ],
);

my @AoA_2 = (
    [ 3 => 'Grupo1' ],
    [ 2 => 'Grupo1' ],
    [ 7 => 'Grupo1' ],
    [ 2 => 'Grupo2' ],
    [ 1 => 'Grupo2' ],
    [ 2 => 'Grupo3' ],
    [ 1 => 'Grupo3' ],
    [ 3 => 'Grupo3' ],
    [ 5 => 'Grupo3' ],
);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
La diferencia es sutil, pero la cantidad de información que guardamos es casi la misma, a costa de acceder a ella de forma diferente.

Y además ya vemos que se pueden repetir claves en el mismo primer hash. No dices si deben tener un trato diferente entre sí, así que suponemos que deben ser tratados como si fueran claves distintas. La diferencia será entonces sus correspondientes valores.

Dices que las claves pueden repetirse, y además hay que camparar las claves de los dos HASH. En ese caso solo hay que hacer un doble bucle que vaya recorriendo las claves del segundo hash por cada clave del primer hash, contabilizando las veces que los valores no coinciden. El resultado es un array, con un valor para cada clave.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados